@@ -6,14 +6,25 @@ use serde::{Deserialize, Serialize};
66use std:: str:: FromStr ;
77
88fn default_base ( ) -> String {
9- "http://localhost:8080 " . to_string ( )
9+ "http://localhost:9042 " . to_string ( )
1010}
1111
1212fn default_port ( ) -> u16 {
13- 8080
13+ 9042
1414}
1515
1616fn default_data_dir ( ) -> String {
17+ #[ cfg( target_family = "unix" ) ]
18+ {
19+ if std:: path:: Path :: new ( "~/.local/share" ) . exists ( ) {
20+ return "~/.local/share/liwan/data" . to_string ( ) ;
21+ }
22+ std:: env:: var ( "XDG_DATA_HOME" )
23+ . map ( |home| format ! ( "{}/liwan/data" , home) )
24+ . unwrap_or_else ( |_| "./liwan-data" . to_string ( ) )
25+ }
26+
27+ #[ cfg( not( target_family = "unix" ) ) ]
1728 "./liwan-data" . to_string ( )
1829}
1930
@@ -45,7 +56,22 @@ impl Config {
4556 pub ( crate ) fn load ( path : Option < String > ) -> Result < Self > {
4657 tracing:: debug!( path = ?path, "loading config" ) ;
4758
59+ let path = path. or_else ( || std:: env:: var ( "LIWAN_CONFIG" ) . ok ( ) ) ;
60+
61+ #[ cfg( target_family = "unix" ) ]
62+ let path = path. or_else ( || match std:: env:: var ( "XDG_CONFIG_HOME" ) {
63+ Ok ( home) => Some ( format ! ( "{}/liwan/config.toml" , home) ) ,
64+ Err ( _) => {
65+ if std:: path:: Path :: new ( "~/.config" ) . exists ( ) {
66+ Some ( "~/.config/liwan/config.toml" . to_string ( ) )
67+ } else {
68+ None
69+ }
70+ }
71+ } ) ;
72+
4873 let config: Config = Figment :: new ( )
74+ . merge ( Toml :: file ( "liwan.config.toml" . to_string ( ) ) )
4975 . merge ( Toml :: file ( path. unwrap_or ( "liwan.config.toml" . to_string ( ) ) ) )
5076 . merge ( Env :: raw ( ) . filter_map ( |key| match key {
5177 k if !k. starts_with ( "LIWAN_" ) => None ,
@@ -102,7 +128,7 @@ mod test {
102128 assert_eq ! ( config. geoip. as_ref( ) . unwrap( ) . maxmind_db_path, Some ( "test" . to_string( ) ) ) ;
103129 assert_eq ! ( config. base_url, "http://localhost:8081" ) ;
104130 assert_eq ! ( config. data_dir, "./liwan-test-data" ) ;
105- assert_eq ! ( config. port, 8080 ) ;
131+ assert_eq ! ( config. port, 9042 ) ;
106132 Ok ( ( ) )
107133 } ) ;
108134 }
@@ -123,7 +149,7 @@ mod test {
123149 assert ! ( config. geoip. is_none( ) ) ;
124150 assert_eq ! ( config. base_url, "http://localhost:8081" ) ;
125151 assert_eq ! ( config. data_dir, "./liwan-test-data" ) ;
126- assert_eq ! ( config. port, 8080 ) ;
152+ assert_eq ! ( config. port, 9042 ) ;
127153 Ok ( ( ) )
128154 } ) ;
129155 }
@@ -133,9 +159,8 @@ mod test {
133159 Jail :: expect_with ( |_jail| {
134160 let config = Config :: load ( None ) . expect ( "failed to load config" ) ;
135161 assert ! ( config. geoip. is_none( ) ) ;
136- assert_eq ! ( config. base_url, "http://localhost:8080" ) ;
137- assert_eq ! ( config. data_dir, "./liwan-data" ) ;
138- assert_eq ! ( config. port, 8080 ) ;
162+ assert_eq ! ( config. base_url, "http://localhost:9042" ) ;
163+ assert_eq ! ( config. port, 9042 ) ;
139164 Ok ( ( ) )
140165 } ) ;
141166 }
0 commit comments