diff --git a/src/config.rs b/src/config.rs index 35b033a..1444514 100644 --- a/src/config.rs +++ b/src/config.rs @@ -124,24 +124,6 @@ impl Default for RawConfig { /// executable 的 builtin 配置 (附带在二进制文件中) (可修改) /// 最基本的默认配置 impl RawConfig { - pub fn new( - show_console: Option, - verbose: Option, - chdir: Option, - bin: Option, - bin_arg: Option, - config: Option, - ) -> Self { - RawConfig { - show_console, - verbose, - chdir, - bin, - bin_arg, - config, - } - } - /// 从命令行参数中获取配置 /// 包括命令行参数中指定的配置文件 pub fn from_cli() -> Self { @@ -164,8 +146,12 @@ impl RawConfig { } else if args[i] == "-h" { show_console = Some(false); } else if args[i] == "--verbose" { + #[cfg(windows)] + crate::win::attach_console(); verbose = Some(true); } else if args[i] == "-v" { + #[cfg(windows)] + crate::win::attach_console(); verbose = Some(true); } else if args[i] == "--help" { show_help(); @@ -309,6 +295,22 @@ impl Display for Config { } } +impl From for Config { + fn from(raw: RawConfig) -> Self { + Config::new( + raw.show_console.unwrap(), + raw.verbose.unwrap(), + raw.chdir, + raw.bin.unwrap(), + raw.bin_arg + .unwrap() + .split(' ') + .map(|x| x.to_string()) + .collect(), + ) + } +} + impl Config { pub fn new( show_console: bool, @@ -327,9 +329,20 @@ impl Config { } pub fn from_cli() -> Self { - let cli_conf = RawConfig::from_cli(); - let execueable_conf = crate::reader::read_self(); + let mut cli_conf = RawConfig::from_cli(); + cli_conf.update_from_config(); + // 从配置文件中更新 - todo!("from_cli") + let execueable_conf = crate::reader::read_self(); + let default_conf = RawConfig::default(); + + if execueable_conf.is_some() { + cli_conf + .merge_config(execueable_conf.unwrap()) + .merge_config(default_conf) + .into() + } else { + cli_conf.merge_config(default_conf).into() + } } } diff --git a/src/win.rs b/src/win.rs index 1190820..33fb2bb 100644 --- a/src/win.rs +++ b/src/win.rs @@ -43,7 +43,12 @@ pub fn run(config: &Config) { } // 先切换工作目录 if let Some(chdir) = config.chdir.as_ref() { - std::env::set_current_dir(chdir).unwrap(); + match std::env::set_current_dir(chdir) { + Ok(_) => {} + Err(e) => { + println!("切换目录失败: {}", e); + } + } } // 如果从终端启动, 且没指定显示终端, 则隐藏 stdout if unsafe { FROM_CONSOLE } {