use std::marker::PhantomData; use near_sdk::serde::{self, Deserializer, Serializer}; use serde_with::{DeserializeAs, SerializeAs}; use tlb_ton::{ BagOfCellsArgs, BoC, Context, r#as::Same, de::r#as::CellDeserializeAsOwned, ser::{ CellSerializeExt, r#as::{CellSerializeAs, CellSerializeWrapAsExt}, }, }; pub struct AsBoC(PhantomData, PhantomData); impl SerializeAs for AsBoC where CellAs: CellSerializeAs, for<'a> As: SerializeAs<&'a [u8]>, { fn serialize_as(source: &T, serializer: S) -> Result where S: Serializer, { let bytes = source .wrap_as::() .to_cell() .map(BoC::from_root) .and_then(|boc| { boc.serialize(BagOfCellsArgs { has_idx: false, has_crc32c: false, }) .context("BoC") }) .context("TL-B") .map_err(serde::ser::Error::custom)?; As::serialize_as(&bytes.as_slice(), serializer) } } impl<'de, T, As, CellAs> DeserializeAs<'de, T> for AsBoC where CellAs: CellDeserializeAsOwned, As: DeserializeAs<'de, Vec>, { fn deserialize_as(deserializer: D) -> Result where D: Deserializer<'de>, { let bytes = As::deserialize_as(deserializer)?; BoC::deserialize(bytes) .and_then(|boc| boc.into_single_root().context("multiple roots")) .context("BoC") .and_then(|root| root.parse_fully_as::()) .context("TL-B") .map_err(serde::de::Error::custom) } } #[cfg(all(feature = "abi", not(target_arch = "wasm32")))] const _: () = { use near_sdk::schemars::{SchemaGenerator, schema::Schema}; use serde_with::schemars_0_8::JsonSchemaAs; impl JsonSchemaAs for AsBoC where As: JsonSchemaAs, { fn schema_name() -> String { As::schema_name() } fn json_schema(generator: &mut SchemaGenerator) -> Schema { As::json_schema(generator) } fn is_referenceable() -> bool { As::is_referenceable() } } };