use bstr::BString; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; #[derive(Deserialize, Serialize)] #[serde(remote = "BString")] pub struct BStringLossyUtf8( #[serde( getter = "bstring_as_vec", serialize_with = "serialize_bytes_string_lossy", deserialize_with = "deserialize_bytes_string" )] pub Vec, ); #[inline] fn bstring_as_vec(b: &BString) -> &Vec { b } impl From for BString { fn from(b: BStringLossyUtf8) -> BString { BString::new(b.0) } } fn serialize_bytes_string_lossy( bytes: &[u8], s: S, ) -> Result { s.serialize_str(&String::from_utf8_lossy(bytes)) } fn deserialize_bytes_string<'de, D: serde::Deserializer<'de>>(d: D) -> Result, D::Error> { struct Vis; impl serde::de::Visitor<'_> for Vis { type Value = Vec; fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { formatter.write_str("a string") } fn visit_str(self, v: &str) -> Result { Ok(v.into()) } } d.deserialize_str(Vis) } impl JsonSchema for BStringLossyUtf8 { fn is_referenceable() -> bool { false } fn schema_id() -> std::borrow::Cow<'static, str> { ::schema_id() } fn schema_name() -> String { ::schema_name() } fn json_schema(gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema { String::json_schema(gen) } }