closer
This commit is contained in:
+39
-3
@@ -5,7 +5,8 @@
|
||||
//! ```text
|
||||
//! ~/.config/KAT/
|
||||
//! config.ini — User configuration
|
||||
//! exports/ — Exported .fob / .sub files
|
||||
//! exports/ — Exported .fob / .sub files (save location)
|
||||
//! import/ — Scanned at startup for .fob / .sub to import
|
||||
//! keystore/ — Protocol encryption keys
|
||||
//! keystore.ini — Key definitions (hex values)
|
||||
//! vag.bin — VAG AUT64 binary key file (optional)
|
||||
@@ -27,6 +28,8 @@ pub struct Config {
|
||||
// [general]
|
||||
/// Directory for exporting signals (.fob / .sub files)
|
||||
pub export_directory: PathBuf,
|
||||
/// Directory scanned at startup for .fob and .sub files to import (separate from export)
|
||||
pub import_directory: PathBuf,
|
||||
/// Maximum captures to keep in memory during a session
|
||||
pub max_captures: usize,
|
||||
/// If off, only successfully decoded signals are added to the list. If on, unknown signals are also shown.
|
||||
@@ -55,6 +58,7 @@ impl Config {
|
||||
fn default_for(config_dir: &PathBuf) -> Self {
|
||||
Self {
|
||||
export_directory: config_dir.join("exports"),
|
||||
import_directory: config_dir.join("import"),
|
||||
max_captures: 100,
|
||||
research_mode: false,
|
||||
default_frequency: 433_920_000,
|
||||
@@ -79,6 +83,11 @@ impl Config {
|
||||
.map(|s| expand_tilde(&s))
|
||||
.unwrap_or(defaults.export_directory);
|
||||
|
||||
let import_directory = ini
|
||||
.get("general", "import_directory")
|
||||
.map(|s| expand_tilde(&s))
|
||||
.unwrap_or(defaults.import_directory);
|
||||
|
||||
let max_captures = ini
|
||||
.getuint("general", "max_captures")
|
||||
.ok()
|
||||
@@ -131,6 +140,7 @@ impl Config {
|
||||
|
||||
Ok(Self {
|
||||
export_directory,
|
||||
import_directory,
|
||||
max_captures,
|
||||
research_mode,
|
||||
default_frequency,
|
||||
@@ -145,6 +155,7 @@ impl Config {
|
||||
/// Save config to an INI-style file with comments explaining each field.
|
||||
fn save_to_ini(&self, path: &std::path::Path) -> Result<()> {
|
||||
let export_str = self.export_directory.to_string_lossy();
|
||||
let import_str = self.import_directory.to_string_lossy();
|
||||
let freq_mhz = self.default_frequency as f64 / 1_000_000.0;
|
||||
|
||||
let content = format!(
|
||||
@@ -159,6 +170,10 @@ impl Config {
|
||||
; Supports ~ for home directory.
|
||||
export_directory = {export_dir}
|
||||
|
||||
; Directory scanned at startup for .fob and .sub files to import (not used for saving).
|
||||
; Supports ~ for home directory.
|
||||
import_directory = {import_dir}
|
||||
|
||||
; Maximum number of captures to keep in memory per session.
|
||||
; Captures are NOT persisted between runs — only exported
|
||||
; signals (.fob / .sub) survive in the exports folder.
|
||||
@@ -192,6 +207,7 @@ include_raw_pairs = {raw_pairs}
|
||||
"#,
|
||||
path = path.display(),
|
||||
export_dir = export_str,
|
||||
import_dir = import_str,
|
||||
max_captures = self.max_captures,
|
||||
research_mode = self.research_mode,
|
||||
freq_mhz = freq_mhz,
|
||||
@@ -315,7 +331,21 @@ impl Storage {
|
||||
);
|
||||
}
|
||||
|
||||
// ── 5. Ensure keystore directory exists ────────────────────────
|
||||
// ── 5. Ensure import directory exists ────────────────────────────
|
||||
if !config.import_directory.exists() {
|
||||
fs::create_dir_all(&config.import_directory).with_context(|| {
|
||||
format!(
|
||||
"Failed to create import dir: {:?}",
|
||||
config.import_directory
|
||||
)
|
||||
})?;
|
||||
tracing::info!(
|
||||
"Created import directory: {:?}",
|
||||
config.import_directory
|
||||
);
|
||||
}
|
||||
|
||||
// ── 6. Ensure keystore directory exists ────────────────────────
|
||||
let keystore_dir = config_dir.join("keystore");
|
||||
if !keystore_dir.exists() {
|
||||
fs::create_dir_all(&keystore_dir).with_context(|| {
|
||||
@@ -324,9 +354,10 @@ impl Storage {
|
||||
tracing::info!("Created keystore directory: {:?}", keystore_dir);
|
||||
}
|
||||
|
||||
// ── 6. Log resolved paths ───────────────────────────────────────
|
||||
// ── 7. Log resolved paths ───────────────────────────────────────
|
||||
tracing::info!("Config dir: {:?}", config_dir);
|
||||
tracing::info!("Export dir: {:?}", config.export_directory);
|
||||
tracing::info!("Import dir: {:?}", config.import_directory);
|
||||
tracing::info!("Keystore dir: {:?}", keystore_dir);
|
||||
|
||||
Ok(Self {
|
||||
@@ -357,6 +388,11 @@ impl Storage {
|
||||
&self.config.export_directory
|
||||
}
|
||||
|
||||
/// Get the import directory path (from config, default `~/.config/KAT/import`)
|
||||
pub fn import_dir(&self) -> &PathBuf {
|
||||
&self.config.import_directory
|
||||
}
|
||||
|
||||
/// Get the keystore directory path (`~/.config/KAT/keystore`). Kept for optional file-based override.
|
||||
#[allow(dead_code)]
|
||||
pub fn keystore_dir(&self) -> PathBuf {
|
||||
|
||||
Reference in New Issue
Block a user