usecrate::prelude::*; usecrate::ule::MaybeEncodeAsVarULE; usecrate::{dynutil::UpcastDataPayload, ule::MaybeAsVarULE}; use alloc::sync::Arc; use databake::{Bake, BakeSize, CrateEnv, TokenStream}; use yoke::*; use zerovec::VarZeroVec;
impl DataPayload<ExportMarker> { /// Serializes this [`DataPayload`] into a serializer using Serde. /// /// # Examples /// /// ``` /// use icu_provider::dynutil::UpcastDataPayload; /// use icu_provider::export::*; /// use icu_provider::hello_world::HelloWorldV1; /// use icu_provider::prelude::*; /// /// // Create an example DataPayload /// let payload: DataPayload<HelloWorldV1> = Default::default(); /// let export: DataPayload<ExportMarker> = UpcastDataPayload::upcast(payload); /// /// // Serialize the payload to a JSON string /// let mut buffer: Vec<u8> = vec![]; /// export /// .serialize(&mut serde_json::Serializer::new(&mut buffer)) /// .expect("Serialization should succeed"); /// assert_eq!(r#"{"message":"(und) Hello World"}"#.as_bytes(), buffer); /// ``` pubfn serialize<S>(&self, serializer: S) -> Result<(), DataError> where
S: serde::Serializer,
S::Ok: 'static, // erased_serde requirement, cannot return values in `Ok`
{ self.get()
.payload
.serialize_yoke(&mut <dyn erased_serde::Serializer>::erase(serializer))
}
/// Serializes this [`DataPayload`]'s value into a [`TokenStream`] /// using its [`Bake`] implementations. /// /// # Examples /// /// ``` /// use icu_provider::dynutil::UpcastDataPayload; /// use icu_provider::export::*; /// use icu_provider::hello_world::HelloWorldV1; /// use icu_provider::prelude::*; /// # use databake::quote; /// # use std::collections::BTreeSet; /// /// // Create an example DataPayload /// let payload: DataPayload<HelloWorldV1> = Default::default(); /// let export: DataPayload<ExportMarker> = UpcastDataPayload::upcast(payload); /// /// let env = databake::CrateEnv::default(); /// let tokens = export.tokenize(&env); /// assert_eq!( /// quote! { /// icu_provider::hello_world::HelloWorld { /// message: alloc::borrow::Cow::Borrowed("(und) Hello World"), /// } /// } /// .to_string(), /// tokens.to_string() /// ); /// assert_eq!( /// env.into_iter().collect::<BTreeSet<_>>(), /// ["icu_provider", "alloc"] /// .into_iter() /// .collect::<BTreeSet<_>>() /// ); /// ``` pubfn tokenize(&self, ctx: &CrateEnv) -> TokenStream { self.get().payload.bake_yoke(ctx)
}
/// If this payload's struct can be dereferenced as a [`VarULE`], /// returns a [`TokenStream`] of the slice encoded as a [`VarZeroVec`]. pubfn tokenize_encoded_seq(structs: &[&Self], ctx: &CrateEnv) -> Option<TokenStream> { let (first, rest) = structs.split_first()?;
first.get().payload.maybe_bake_varule_encoded(rest, ctx)
}
/// Returns the data size using postcard encoding pubfn postcard_size(&self) -> usize { use postcard::ser_flavors::{Flavor, Size}; letmut serializer = postcard::Serializer {
output: Size::default(),
}; let _infallible = self
.get()
.payload
.serialize_yoke(&mut <dyn erased_serde::Serializer>::erase(&n style='color:red'>mut serializer));
/// Returns an estimate of the baked size, made up of the size of the struct itself, /// as well as the sizes of all its static borrows. /// /// As static borrows are deduplicated by the linker, this is often overcounting. pubfn baked_size(&self) -> usize { self.get().payload.bake_size()
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.