1
1
use std:: error:: Error ;
2
2
3
- use crate :: { map:: Map , value:: Value } ;
3
+ use crate :: error:: { ConfigError , Unexpected } ;
4
+ use crate :: map:: Map ;
5
+ use crate :: value:: { Value , ValueKind } ;
4
6
5
7
/// Describes a format of configuration source data
6
8
///
@@ -21,3 +23,24 @@ pub trait Format {
21
23
text : & str ,
22
24
) -> Result < Map < String , Value > , Box < dyn Error + Send + Sync > > ;
23
25
}
26
+
27
+ // Have a proper error fire if the root of a file is ever not a Table
28
+ pub fn extract_root_table (
29
+ uri : Option < & String > ,
30
+ value : Value ,
31
+ ) -> Result < Map < String , Value > , Box < dyn Error + Send + Sync > > {
32
+ match value. kind {
33
+ ValueKind :: Table ( map) => Ok ( map) ,
34
+ ValueKind :: Nil => Err ( Unexpected :: Unit ) ,
35
+ ValueKind :: Array ( _value) => Err ( Unexpected :: Seq ) ,
36
+ ValueKind :: Boolean ( value) => Err ( Unexpected :: Bool ( value) ) ,
37
+ ValueKind :: I64 ( value) => Err ( Unexpected :: I64 ( value) ) ,
38
+ ValueKind :: I128 ( value) => Err ( Unexpected :: I128 ( value) ) ,
39
+ ValueKind :: U64 ( value) => Err ( Unexpected :: U64 ( value) ) ,
40
+ ValueKind :: U128 ( value) => Err ( Unexpected :: U128 ( value) ) ,
41
+ ValueKind :: Float ( value) => Err ( Unexpected :: Float ( value) ) ,
42
+ ValueKind :: String ( value) => Err ( Unexpected :: Str ( value) ) ,
43
+ }
44
+ . map_err ( |err| ConfigError :: invalid_root ( uri, err) )
45
+ . map_err ( |err| Box :: new ( err) as Box < dyn Error + Send + Sync > )
46
+ }
0 commit comments