pub(crate) fn is_default<T>(value: &T) -> bool
where
T: Default + PartialEq,
{
*value == T::default()
}
pub(crate) fn option_is_none_or_default<T>(value: &Option<T>) -> bool
where
T: Default + PartialEq,
{
value.as_ref().is_none_or(|v| *v == T::default())
}
pub(crate) fn is_zero_u32(value: &u32) -> bool {
*value == 0
}
pub(crate) fn is_zero_i32(value: &i32) -> bool {
*value == 0
}
pub(crate) fn is_empty_vec<T>(value: &[T]) -> bool {
value.is_empty()
}
pub(crate) fn is_false(value: &bool) -> bool {
!*value
}
pub(crate) fn deserialize_string_or_number<'de, D>(
deserializer: D,
) -> std::result::Result<Option<String>, D::Error>
where
D: serde::Deserializer<'de>,
{
use serde::Deserialize;
#[derive(Deserialize)]
#[serde(untagged)]
enum StringOrNumber {
Str(String),
I64(i64),
U64(u64),
F64(f64),
}
let value = Option::<StringOrNumber>::deserialize(deserializer)?;
Ok(value.map(|v| match v {
StringOrNumber::Str(s) => s,
StringOrNumber::I64(n) => n.to_string(),
StringOrNumber::U64(n) => n.to_string(),
StringOrNumber::F64(n) => n.to_string(),
}))
}