Implemented selective symbol and footprint import in config

This commit is contained in:
2026-03-14 22:34:23 +01:00
parent 32dc396e54
commit c5f35efc9a

View File

@@ -16,6 +16,7 @@ use zip::ZipArchive;
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
struct Config { struct Config {
libraries: LibConfig, libraries: LibConfig,
options: Option<OptionsConfig>,
} }
impl Config { impl Config {
@@ -34,6 +35,7 @@ impl Config {
libraries: LibConfig { libraries: LibConfig {
path: PathBuf::from("~/KiCad/libraries/"), path: PathBuf::from("~/KiCad/libraries/"),
}, },
options: None,
}; };
let contents = toml::to_string_pretty(&config).map_err(|_| ConfigError::ConfigErr)?; let contents = toml::to_string_pretty(&config).map_err(|_| ConfigError::ConfigErr)?;
fs::write(&config_path, contents).map_err(|_| ConfigError::ConfigErr)?; fs::write(&config_path, contents).map_err(|_| ConfigError::ConfigErr)?;
@@ -47,6 +49,12 @@ struct LibConfig {
path: PathBuf, path: PathBuf,
} }
#[derive(Debug, Deserialize, Serialize, Clone)]
struct OptionsConfig {
symbols: Option<bool>,
footprints: Option<bool>,
}
enum SourceType { enum SourceType {
SymacSys, SymacSys,
UltraLibrarian, UltraLibrarian,
@@ -311,7 +319,7 @@ fn import_symacsys(path: &Path, config: &Config) -> Result<(), ImportError> {
let sym = root.join("SymacSys_Components.kicad_sym"); let sym = root.join("SymacSys_Components.kicad_sym");
let pretty = root.join("SymacSys_Footprints.pretty"); let pretty = root.join("SymacSys_Footprints.pretty");
install_library(sym_files, mod_files, &root, &sym, &pretty)?; install_library(sym_files, mod_files, &root, &sym, &pretty, config)?;
fs::remove_dir_all(tmp_path).map_err(|_| ImportError::InvalidPath)?; fs::remove_dir_all(tmp_path).map_err(|_| ImportError::InvalidPath)?;
Ok(()) Ok(())
@@ -365,7 +373,7 @@ fn import_ultralibrarian(path: &Path, config: &Config) -> Result<(), ImportError
let sym = root.join("UltraLibrarian_Components.kicad_sym"); let sym = root.join("UltraLibrarian_Components.kicad_sym");
let pretty = root.join("UltraLibrarian_Footprints.pretty"); let pretty = root.join("UltraLibrarian_Footprints.pretty");
install_library(sym_files, mod_files, &root, &sym, &pretty)?; install_library(sym_files, mod_files, &root, &sym, &pretty, config)?;
fs::remove_dir_all(tmp_path).map_err(|_| ImportError::InvalidPath)?; fs::remove_dir_all(tmp_path).map_err(|_| ImportError::InvalidPath)?;
Ok(()) Ok(())
@@ -406,7 +414,7 @@ fn import_snapmagic(path: &Path, config: &Config) -> Result<(), ImportError> {
let sym = root.join("SnapMagic_components.kicad_sym"); let sym = root.join("SnapMagic_components.kicad_sym");
let pretty = root.join("SnapMagic_Footprints.pretty"); let pretty = root.join("SnapMagic_Footprints.pretty");
install_library(sym_files, mod_files, &root, &sym, &pretty)?; install_library(sym_files, mod_files, &root, &sym, &pretty, config)?;
fs::remove_dir_all(data_dir).map_err(|_| ImportError::InvalidPath)?; fs::remove_dir_all(data_dir).map_err(|_| ImportError::InvalidPath)?;
Ok(()) Ok(())
@@ -418,10 +426,23 @@ fn install_library(
lib_root: &Path, lib_root: &Path,
sym_file: &Path, sym_file: &Path,
pretty_dir: &Path, pretty_dir: &Path,
config: &Config,
) -> Result<(), ImportError> { ) -> Result<(), ImportError> {
let symbols = config
.options
.as_ref()
.and_then(|o| o.symbols)
.unwrap_or(true);
let footprints = config
.options
.as_ref()
.and_then(|o| o.footprints)
.unwrap_or(true);
fs::create_dir_all(lib_root).map_err(|_| ImportError::InvalidPath)?; fs::create_dir_all(lib_root).map_err(|_| ImportError::InvalidPath)?;
fs::create_dir_all(pretty_dir).map_err(|_| ImportError::InvalidPath)?; fs::create_dir_all(pretty_dir).map_err(|_| ImportError::InvalidPath)?;
if symbols {
// Load or create symbol library // Load or create symbol library
let mut current_lib = if sym_file.exists() { let mut current_lib = if sym_file.exists() {
let contents = fs::read_to_string(sym_file).map_err(|_| ImportError::InvalidPath)?; let contents = fs::read_to_string(sym_file).map_err(|_| ImportError::InvalidPath)?;
@@ -446,13 +467,16 @@ fn install_library(
let output = current_lib.write(); let output = current_lib.write();
fs::write(sym_file, output).map_err(|_| ImportError::InvalidPath)?; fs::write(sym_file, output).map_err(|_| ImportError::InvalidPath)?;
} }
}
if footprints {
// Install footprints // Install footprints
for mod_path in mod_files { for mod_path in mod_files {
let filename = mod_path.file_name().ok_or(ImportError::InvalidPath)?; let filename = mod_path.file_name().ok_or(ImportError::InvalidPath)?;
let target = pretty_dir.join(filename); let target = pretty_dir.join(filename);
fs::copy(mod_path, target).map_err(|_| ImportError::InvalidPath)?; fs::copy(mod_path, target).map_err(|_| ImportError::InvalidPath)?;
} }
}
Ok(()) Ok(())
} }