pub(super) static NEWTYPE_SYMBOL: &str = "\u{037E}BYTESSET\u{037E}";
#[inline]
pub(crate) fn should_serialize_as_binary_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 BinarySet<T>(pub T);
impl<T> serde_core::Serialize for BinarySet<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::B(s) = v {
Ok(s)
} else {
Err(crate::error::ErrorImpl::BinarySetExpectedType.into())
}
})
.collect::<Result<_, _>>()?;
Ok(crate::AttributeValue::Bs(set))
}
#[cfg(test)]
mod tests {
use serde_derive::{Deserialize, Serialize};
use crate::binary_set::BinarySet;
#[test]
fn newtype_binaries_set_in_struct() {
use serde_bytes::ByteBuf;
let set = vec![
ByteBuf::from(b"test".as_slice()),
ByteBuf::from(b"test2".as_slice()),
];
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
struct Struct {
#[serde(with = "crate::binary_set")]
set: Vec<ByteBuf>,
}
let item: crate::Item = dbg!(crate::to_item(Struct { set }).unwrap());
assert_eq!(
item["set"],
crate::AttributeValue::Bs(vec![b"test".to_vec(), b"test2".to_vec(),])
);
}
#[test]
fn newtype_set_for_binaries() {
use serde_bytes::Bytes;
let set = vec![
Bytes::new(b"test".as_slice()),
Bytes::new(b"test2".as_slice()),
];
let val: crate::AttributeValue = dbg!(crate::to_attribute_value(BinarySet(set)).unwrap());
assert_eq!(
val,
crate::AttributeValue::Bs(vec![b"test".to_vec(), b"test2".to_vec(),])
);
}
}