pub(super) static NEWTYPE_SYMBOL: &str = "\u{037E}NUMBERSET\u{037E}";
#[inline]
pub(crate) fn should_serialize_as_numbers_set(name: &str) -> bool {
std::ptr::eq(name, NEWTYPE_SYMBOL)
}
pub fn serialize<T, S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
where
T: serde_core::Serialize,
S: serde_core::Serializer,
{
serializer.serialize_newtype_struct(NEWTYPE_SYMBOL, &value)
}
pub fn deserialize<'de, T, D>(deserializer: D) -> Result<T, D::Error>
where
T: serde_core::Deserialize<'de>,
D: serde_core::Deserializer<'de>,
{
T::deserialize(deserializer)
}
pub struct NumberSet<T>(pub T);
impl<T> serde_core::Serialize for NumberSet<T>
where
T: serde_core::Serialize,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde_core::Serializer,
{
serializer.serialize_newtype_struct(NEWTYPE_SYMBOL, &self.0)
}
}
#[inline(never)]
pub(crate) fn convert_to_set(value: crate::AttributeValue) -> crate::Result<crate::AttributeValue> {
let vals = match value {
crate::AttributeValue::L(vals) => vals,
_ => return Err(crate::error::ErrorImpl::NotSetlike.into()),
};
let set = vals
.into_iter()
.map(|v| {
if let crate::AttributeValue::N(s) = v {
Ok(s)
} else {
Err(crate::error::ErrorImpl::NumberSetExpectedType.into())
}
})
.collect::<Result<_, _>>()?;
Ok(crate::AttributeValue::Ns(set))
}
#[cfg(test)]
mod tests {
use serde_derive::{Deserialize, Serialize};
use crate::number_set::NumberSet;
#[test]
fn newtype_numbers_set_in_struct() {
let set = vec![123234, 535622];
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
struct Struct {
#[serde(with = "crate::number_set")]
set: Vec<u64>,
}
let item: crate::Item = dbg!(crate::to_item(Struct { set }).unwrap());
assert_eq!(
item["set"],
crate::AttributeValue::Ns(vec!["123234".to_string(), "535622".to_string(),])
);
}
#[test]
fn newtype_set_for_numbers() {
let set = vec![85, 99];
let val: crate::AttributeValue = dbg!(crate::to_attribute_value(NumberSet(set)).unwrap());
assert_eq!(
val,
crate::AttributeValue::Ns(vec!["85".to_string(), "99".to_string(),])
);
}
}