structupdate_support 0.2.0

Type definitions used by the structupdate crate
Documentation
use crate::DefaultValueConstructor;
use crate::Value;

pub fn value_false() -> Value<bool> {
    Value::default()
}

pub fn value_true() -> Value<bool> {
    default_value(|| true)
}

pub fn default_string(s: impl ToString + Clone + 'static) -> impl Fn() -> Value<String> {
    move || {
        let s_clone = s.clone();
        default_value(|| s_clone.to_string())
    }
}

macro_rules! make_default_fn {
    ($name:ident, $ty:ty) => {
        pub fn $name(int: $ty) -> impl Fn() -> Value<$ty> {
            move || default_value(|| int)
        }
    };
}

make_default_fn!(default_u8, u8);
make_default_fn!(default_u16, u16);
make_default_fn!(default_u32, u32);
make_default_fn!(default_u64, u64);
make_default_fn!(default_i8, i8);
make_default_fn!(default_i16, i16);
make_default_fn!(default_i32, i32);
make_default_fn!(default_i64, i64);

pub fn default_value<F, T>(f: F) -> Value<T>
where
    F: Fn() -> T,
{
    Value {
        value: f(),
        default: DefaultValueConstructor::Custom(f()),
    }
}