1- use app:: configuration:: Workspace ;
1+ use app:: configuration:: { GlobalConfig , Workspace } ;
2+ use chrono:: naive:: serde;
23use clap:: Args ;
3- use std:: path:: PathBuf ;
4+ use std:: { fs , path:: PathBuf } ;
45use tracing:: debug;
56
67#[ derive( Args , Clone , Debug , Default ) ]
@@ -11,18 +12,35 @@ pub struct GlobalArgs {
1112 #[ arg( long, env = "YOZEFU_CONFIG_DIR" , global = true ) ]
1213 /// Use a specific config directory to store the configuration, logs, search filters.
1314 pub config_dir : Option < PathBuf > ,
15+ #[ arg( long, env = "YOZEFU_LOG_FILE" , global = true ) ]
16+ /// Append logs to a specific log file
17+ pub log_file : Option < PathBuf > ,
1418}
1519
1620impl GlobalArgs {
1721 pub fn workspace ( & self ) -> Workspace {
1822 let default_workspace = Workspace :: default ( ) ;
23+
1924 let workspace = match ( & self . config_dir , & self . config_file ) {
2025 ( Some ( dir) , Some ( file) ) => Workspace :: new ( dir, file) ,
2126 ( Some ( dir) , None ) => Workspace :: new ( dir, & dir. join ( Workspace :: CONFIG_FILENAME ) ) ,
2227 ( None , Some ( file) ) => Workspace :: new ( & default_workspace. path , file) ,
2328 ( None , None ) => default_workspace,
2429 } ;
2530
31+
32+
33+ let lo = match self . log_file {
34+ Some ( log_file) => log_file,
35+ None => {
36+ let contents = fs:: read_to_string ( workspace. config_file ( ) ) . unwrap_or ( "{}" . to_string ( ) ) ;
37+ let config: GlobalConfig = serde_json:: from_str ( & contents)
38+ . unwrap_or_default ( ) ;
39+ config. log_file . unwrap_or_else ( || workspace. logs_file ( ) )
40+ }
41+ }
42+
43+
2644 debug ! ( "Using config directory: {}" , workspace. path. display( ) ) ;
2745 workspace
2846 }
@@ -42,6 +60,7 @@ mod tests {
4260 let args = GlobalArgs {
4361 config_dir : Some ( PathBuf :: from ( "/tmp/config_dir" ) ) ,
4462 config_file : Some ( PathBuf :: from ( "/tmp/config_dir/config.json" ) ) ,
63+ log_file : None ,
4564 } ;
4665 let ws = args. workspace ( ) ;
4766 assert_eq ! ( ws. path, PathBuf :: from( "/tmp/config_dir" ) ) ;
@@ -56,6 +75,7 @@ mod tests {
5675 let args = GlobalArgs {
5776 config_dir : Some ( PathBuf :: from ( "/tmp/config_dir" ) ) ,
5877 config_file : None ,
78+ log_file : None ,
5979 } ;
6080 let ws = args. workspace ( ) ;
6181 assert_eq ! ( ws. path, PathBuf :: from( "/tmp/config_dir" ) ) ;
@@ -80,6 +100,7 @@ mod tests {
80100 let args = GlobalArgs {
81101 config_dir : None ,
82102 config_file : Some ( PathBuf :: from ( "/tmp/config_dir/config.json" ) ) ,
103+ log_file : None ,
83104 } ;
84105 let ws = args. workspace ( ) ;
85106 assert_eq ! ( ws. path, default_ws. path) ;
@@ -95,6 +116,7 @@ mod tests {
95116 let args = GlobalArgs {
96117 config_dir : None ,
97118 config_file : None ,
119+ log_file : None ,
98120 } ;
99121 let ws = args. workspace ( ) ;
100122 assert_eq ! ( ws. path, default_ws. path) ;
@@ -106,6 +128,7 @@ mod tests {
106128 let args = GlobalArgs {
107129 config_dir : Some ( PathBuf :: from ( "/tmp/config_dir" ) ) ,
108130 config_file : Some ( PathBuf :: from ( "/tmp/config_dir/config.json" ) ) ,
131+ log_file : None ,
109132 } ;
110133 assert_eq ! (
111134 args. workspace( ) . config_file( ) ,
0 commit comments