use crate::value::Value;
pub(crate) fn from_figment(value: &figment::value::Value) -> Value {
use figment::value::{Empty, Num};
match value {
figment::value::Value::String(_, string) => Value::String(string.clone()),
figment::value::Value::Char(_, character) => Value::String(character.to_string()),
figment::value::Value::Bool(_, boolean) => Value::Bool(*boolean),
figment::value::Value::Num(_, number) => match number {
Num::U8(n) => Value::Integer(i128::from(*n)),
Num::U16(n) => Value::Integer(i128::from(*n)),
Num::U32(n) => Value::Integer(i128::from(*n)),
Num::U64(n) => Value::Integer(i128::from(*n)),
Num::USize(n) => Value::Integer(*n as i128),
Num::U128(n) => i128::try_from(*n)
.map(Value::Integer)
.unwrap_or(Value::Float(*n as f64)),
Num::I8(n) => Value::Integer(i128::from(*n)),
Num::I16(n) => Value::Integer(i128::from(*n)),
Num::I32(n) => Value::Integer(i128::from(*n)),
Num::I64(n) => Value::Integer(i128::from(*n)),
Num::ISize(n) => Value::Integer(*n as i128),
Num::I128(n) => Value::Integer(*n),
Num::F32(n) => Value::Float(f64::from(*n)),
Num::F64(n) => Value::Float(*n),
},
figment::value::Value::Empty(_, Empty::None | Empty::Unit) => Value::Null,
figment::value::Value::Dict(_, dict) => Value::Table(
dict.iter()
.map(|(key, value)| (key.clone(), from_figment(value)))
.collect(),
),
figment::value::Value::Array(_, values) => {
Value::Array(values.iter().map(from_figment).collect())
}
}
}
pub(crate) fn to_figment(value: &Value) -> figment::value::Value {
use figment::value::{Empty, Num, Tag};
match value {
Value::Null => figment::value::Value::Empty(Tag::Default, Empty::None),
Value::Bool(boolean) => figment::value::Value::Bool(Tag::Default, *boolean),
Value::Integer(number) => figment::value::Value::Num(
Tag::Default,
i64::try_from(*number).map_or_else(
|_| u64::try_from(*number).map_or(Num::I128(*number), Num::U64),
Num::I64,
),
),
Value::Float(number) => figment::value::Value::Num(Tag::Default, Num::F64(*number)),
Value::String(text) => figment::value::Value::String(Tag::Default, text.clone()),
Value::Array(values) => {
figment::value::Value::Array(Tag::Default, values.iter().map(to_figment).collect())
}
Value::Table(table) => figment::value::Value::Dict(
Tag::Default,
table
.iter()
.map(|(key, value)| (key.clone(), to_figment(value)))
.collect(),
),
}
}