1use std::error::Error;
2
3use crate::error::{ConfigError, Unexpected};
4use crate::map::Map;
5use crate::value::{Value, ValueKind};
6
7pub trait Format {
17 fn parse(
21 &self,
22 uri: Option<&String>,
23 text: &str,
24 ) -> Result<Map<String, Value>, Box<dyn Error + Send + Sync>>;
25}
26
27pub(crate) 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}