use crate::value::to_value;
use crate::{Map, Value};
use decoder_value::Value as Raw;
use serde::Serialize;
use std::time::Duration;
pub fn bool(value: bool) -> Value {
serialize(value)
}
pub fn u8(value: u8) -> Value {
serialize(value)
}
pub fn u16(value: u16) -> Value {
serialize(value)
}
pub fn u32(value: u32) -> Value {
serialize(value)
}
pub fn u64(value: u64) -> Value {
serialize(value)
}
pub fn i8(value: i8) -> Value {
serialize(value)
}
pub fn i16(value: i16) -> Value {
serialize(value)
}
pub fn i32(value: i32) -> Value {
serialize(value)
}
pub fn i64(value: i64) -> Value {
serialize(value)
}
pub fn f32(value: f32) -> Value {
serialize(value)
}
pub fn f64(value: f64) -> Value {
serialize(value)
}
pub fn string(value: impl Into<String>) -> Value {
serialize(value.into())
}
pub fn duration(duration: Duration) -> Value {
map([
("secs", u64(duration.as_secs())),
("nanos", u32(duration.subsec_nanos())),
])
.into()
}
pub fn map<'a>(fields: impl IntoIterator<Item = (&'a str, Value)>) -> Map {
Map::from_iter(fields.into_iter().map(|(key, value)| (string(key), value)))
}
pub fn optional<T, V>(f: impl Fn(T) -> V, value: Option<T>) -> Value
where
V: Into<Value>,
{
Value(Raw::Option(
value.map(|value| f(value).into().0).map(Box::new),
))
}
pub fn sequence<T, V>(f: impl Fn(T) -> V, items: impl IntoIterator<Item = T>) -> Value
where
V: Into<Value>,
{
Value(Raw::Seq(
items.into_iter().map(|value| f(value).into().0).collect(),
))
}
fn serialize(data: impl Serialize) -> Value {
to_value(data).expect("Serialize value")
}