11use std:: error:: Error ;
22
3- use crate :: { map:: Map , value:: Value } ;
3+ use crate :: error:: { ConfigError , Unexpected } ;
4+ use crate :: map:: Map ;
5+ use crate :: value:: { Value , ValueKind } ;
46
57/// Describes a format of configuration source data
68///
@@ -21,3 +23,24 @@ pub trait Format {
2123 text : & str ,
2224 ) -> Result < Map < String , Value > , Box < dyn Error + Send + Sync > > ;
2325}
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