use alloc::vec::Vec;
use core::fmt;
use serde::{Deserializer, Serializer, de};
pub fn serialize<S: Serializer>(values: &[bool], serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_bytes(bytemuck::must_cast_slice(values))
}
pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Vec<bool>, D::Error> {
struct Visitor;
impl de::Visitor<'_> for Visitor {
type Value = Vec<bool>;
fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("boolean bytes")
}
fn visit_bytes<E: de::Error>(self, bytes: &[u8]) -> Result<Self::Value, E> {
let words: &[bool] = bytemuck::checked::try_cast_slice(bytes)
.map_err(|_| E::custom("invalid boolean byte"))?;
let mut values = Vec::new();
values
.try_reserve_exact(words.len())
.map_err(|_| E::custom("allocation"))?;
values.extend_from_slice(words);
Ok(values)
}
}
deserializer.deserialize_bytes(Visitor)
}