@@ -68,22 +68,29 @@ pub fn parse(config: Config, named_table: Option<&str>) -> Result<Vec<OsString>,
68
68
/// Reads in `.erdtree.toml` file.
69
69
pub fn load ( ) -> Result < Config , Error > {
70
70
#[ cfg( windows) ]
71
- return windows:: load_toml ( ) . ok_or ( Error :: LoadConfig ) ;
71
+ return windows:: load_toml ( ) ;
72
72
73
73
#[ cfg( unix) ]
74
- unix:: load_toml ( ) . ok_or ( Error :: LoadConfig )
74
+ unix:: load_toml ( )
75
75
}
76
76
77
- /// Attempts to load in `.erdtree.toml` from `$ERDTREE_TOML_PATH`. Will return `None` for whatever
78
- /// reason.
79
- fn toml_from_env ( ) -> Option < Config > {
77
+ /// Attempts to load in `.erdtree.toml` from `$ERDTREE_TOML_PATH`.
78
+ fn toml_from_env ( ) -> Result < Config , Error > {
80
79
let config = env:: var_os ( super :: ERDTREE_TOML_PATH )
81
80
. map ( OsString :: into_string)
82
- . and_then ( Result :: ok) ?;
83
-
84
- let file = config. strip_suffix ( ".toml" ) . map ( File :: with_name) ?;
85
-
86
- Config :: builder ( ) . add_source ( file) . build ( ) . ok ( )
81
+ . transpose ( )
82
+ . map_err ( |_| Error :: LoadConfig ) ?
83
+ . ok_or ( Error :: LoadConfig ) ?;
84
+
85
+ let file = config
86
+ . strip_suffix ( ".toml" )
87
+ . map ( File :: with_name)
88
+ . ok_or ( Error :: LoadConfig ) ?;
89
+
90
+ Config :: builder ( )
91
+ . add_source ( file)
92
+ . build ( )
93
+ . map_err ( Error :: from)
87
94
}
88
95
89
96
/// Simple utility used to extract the underlying value from the [`Value`] enum that we get when
@@ -126,7 +133,8 @@ fn parse_argument(keyword: &str, arg: &Value) -> Result<ArgInstructions, Error>
126
133
#[ cfg( unix) ]
127
134
mod unix {
128
135
use super :: super :: { CONFIG_DIR , ERDTREE_CONFIG_TOML , ERDTREE_DIR , HOME , XDG_CONFIG_HOME } ;
129
- use config:: { Config , File } ;
136
+ use super :: Error ;
137
+ use config:: { Config , ConfigError , File } ;
130
138
use std:: { env, path:: PathBuf } ;
131
139
132
140
/// Looks for `.erdtree.toml` in the following locations in order:
@@ -136,18 +144,20 @@ mod unix {
136
144
/// - `$XDG_CONFIG_HOME/.erdtree.toml`
137
145
/// - `$HOME/.config/erdtree/.erdtree.toml`
138
146
/// - `$HOME/.erdtree.toml`
139
- pub ( super ) fn load_toml ( ) -> Option < Config > {
147
+ pub ( super ) fn load_toml ( ) -> Result < Config , Error > {
140
148
super :: toml_from_env ( )
141
- . or_else ( toml_from_xdg_path)
142
- . or_else ( toml_from_home)
149
+ . or_else ( |_| toml_from_xdg_path ( ) )
150
+ . or_else ( |_| toml_from_home ( ) )
143
151
}
144
152
145
153
/// Looks for `.erdtree.toml` in the following locations in order:
146
154
///
147
155
/// - `$XDG_CONFIG_HOME/erdtree/.erdtree.toml`
148
156
/// - `$XDG_CONFIG_HOME/.erdtree.toml`
149
- fn toml_from_xdg_path ( ) -> Option < Config > {
150
- let config = env:: var_os ( XDG_CONFIG_HOME ) . map ( PathBuf :: from) ?;
157
+ fn toml_from_xdg_path ( ) -> Result < Config , Error > {
158
+ let config = env:: var_os ( XDG_CONFIG_HOME )
159
+ . map ( PathBuf :: from)
160
+ . ok_or ( Error :: LoadConfig ) ?;
151
161
152
162
let mut file = config
153
163
. join ( ERDTREE_DIR )
@@ -164,15 +174,20 @@ mod unix {
164
174
. map ( File :: with_name) ;
165
175
}
166
176
167
- Config :: builder ( ) . add_source ( file?) . build ( ) . ok ( )
177
+ file. map_or_else (
178
+ || Err ( Error :: LoadConfig ) ,
179
+ |f| Config :: builder ( ) . add_source ( f) . build ( ) . map_err ( Error :: from) ,
180
+ )
168
181
}
169
182
170
183
/// Looks for `.erdtree.toml` in the following locations in order:
171
184
///
172
185
/// - `$HOME/.config/erdtree/.erdtree.toml`
173
186
/// - `$HOME/.erdtree.toml`
174
- fn toml_from_home ( ) -> Option < Config > {
175
- let home = env:: var_os ( HOME ) . map ( PathBuf :: from) ?;
187
+ fn toml_from_home ( ) -> Result < Config , Error > {
188
+ let home = env:: var_os ( HOME )
189
+ . map ( PathBuf :: from)
190
+ . ok_or ( Error :: LoadConfig ) ?;
176
191
177
192
let mut file = home
178
193
. join ( CONFIG_DIR )
@@ -190,25 +205,35 @@ mod unix {
190
205
. map ( File :: with_name) ;
191
206
}
192
207
193
- Config :: builder ( ) . add_source ( file?) . build ( ) . ok ( )
208
+ file. map_or_else (
209
+ || Err ( Error :: LoadConfig ) ,
210
+ |f| Config :: builder ( )
211
+ . add_source ( f)
212
+ . build ( )
213
+ . map_err ( |err| match err {
214
+ ConfigError :: FileParse { .. } | ConfigError :: Type { .. } => Error :: from ( err) ,
215
+ _ => Error :: LoadConfig ,
216
+ } ) ,
217
+ )
194
218
}
195
219
}
196
220
197
221
/// Concerned with how to load `.erdtree.toml` on Windows.
198
222
#[ cfg( windows) ]
199
223
mod windows {
200
224
use super :: super :: { ERDTREE_CONFIG_TOML , ERDTREE_DIR } ;
225
+ use super :: Error ;
201
226
use config:: { Config , File } ;
202
227
203
228
/// Try to read in config from the following location:
204
229
/// - `%APPDATA%\erdtree\.erdtree.toml`
205
- pub ( super ) fn load_toml ( ) -> Option < Config > {
230
+ pub ( super ) fn load_toml ( ) -> Result < Config , Error > {
206
231
super :: toml_from_env ( ) . or_else ( toml_from_appdata)
207
232
}
208
233
209
234
/// Try to read in config from the following location:
210
235
/// - `%APPDATA%\erdtree\.erdtree.toml`
211
- fn toml_from_appdata ( ) -> Option < Config > {
236
+ fn toml_from_appdata ( ) -> Result < Config , Error > {
212
237
let app_data = dirs:: config_dir ( ) ?;
213
238
214
239
let file = app_data
@@ -218,6 +243,9 @@ mod windows {
218
243
. and_then ( |s| s. strip_suffix ( ".toml" ) )
219
244
. map ( File :: with_name) ?;
220
245
221
- Config :: builder ( ) . add_source ( file) . build ( ) . ok ( )
246
+ Config :: builder ( )
247
+ . add_source ( file)
248
+ . build ( )
249
+ . map_err ( Error :: from)
222
250
}
223
251
}
0 commit comments