feat: add multi-profile config support with profile selection
Co-authored-by: aider (openai/gpt-5) <aider@aider.chat>
This commit is contained in:
parent
ee23385af9
commit
c1013feda6
1 changed files with 38 additions and 5 deletions
43
src/main.rs
43
src/main.rs
|
|
@ -1,12 +1,13 @@
|
||||||
use anyhow::{Context, Result};
|
use anyhow::{Context, Result};
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
|
use std::collections::HashMap;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
use tempfile::TempDir;
|
use tempfile::TempDir;
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug, Deserialize, Clone)]
|
||||||
struct Settings {
|
struct Settings {
|
||||||
nas_host: String,
|
nas_host: String,
|
||||||
nas_user: String,
|
nas_user: String,
|
||||||
|
|
@ -14,6 +15,11 @@ struct Settings {
|
||||||
cookies_file: String,
|
cookies_file: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
struct AppConfig {
|
||||||
|
profiles: HashMap<String, Settings>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Parser, Debug)]
|
#[derive(Parser, Debug)]
|
||||||
#[command(author, version, about, long_about = None)]
|
#[command(author, version, about, long_about = None)]
|
||||||
struct Args {
|
struct Args {
|
||||||
|
|
@ -48,10 +54,37 @@ fn main() -> Result<()> {
|
||||||
|
|
||||||
println!("[INFO] Using config file at: {}", config_path.display());
|
println!("[INFO] Using config file at: {}", config_path.display());
|
||||||
|
|
||||||
let settings = config::Config::builder()
|
let cfg = config::Config::builder()
|
||||||
.add_source(config::File::from(config_path))
|
.add_source(config::File::from(config_path.clone()))
|
||||||
.build()?
|
.build()?;
|
||||||
.try_deserialize::<Settings>()?;
|
|
||||||
|
let selected_profile = args.profile.clone();
|
||||||
|
let settings: Settings = match cfg.clone().try_deserialize::<AppConfig>() {
|
||||||
|
Ok(app_cfg) => {
|
||||||
|
if let Some(s) = app_cfg.profiles.get(&selected_profile).cloned() {
|
||||||
|
println!("[INFO] Using profile: {}", selected_profile);
|
||||||
|
s
|
||||||
|
} else if let Some(s) = app_cfg.profiles.get("default").cloned() {
|
||||||
|
if selected_profile != "default" {
|
||||||
|
println!("[WARN] Profile '{}' not found. Falling back to 'default'.", selected_profile);
|
||||||
|
let available = app_cfg.profiles.keys().cloned().collect::<Vec<_>>().join(", ");
|
||||||
|
println!("[INFO] Available profiles: {}", available);
|
||||||
|
} else {
|
||||||
|
println!("[INFO] Using profile: default");
|
||||||
|
}
|
||||||
|
s
|
||||||
|
} else {
|
||||||
|
anyhow::bail!("No profile '{}' found and no 'default' profile defined in config.", selected_profile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(_) => {
|
||||||
|
if selected_profile != "default" {
|
||||||
|
println!("[WARN] Requested profile '{}' but config file uses single-profile format. Using that single profile.", selected_profile);
|
||||||
|
}
|
||||||
|
println!("[INFO] Using legacy single-profile configuration.");
|
||||||
|
cfg.try_deserialize::<Settings>()?
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Create temp directory
|
// Create temp directory
|
||||||
let temp_dir = TempDir::new().context("Failed to create temporary directory")?;
|
let temp_dir = TempDir::new().context("Failed to create temporary directory")?;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue