#![allow(rustdoc::broken_intra_doc_links)] //! Helper for [`serde_with::base64::Base64`] to implement [`serde_with::schemars_0_8::JsonSchemaAs`] on it. pub use serde_with::{ base64::{Alphabet, Standard, UrlSafe}, formats::{Format, Padded, Unpadded}, }; use derive_more::From; use near_sdk::serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde_with::{DeserializeAs, SerializeAs, serde_as}; pub struct Base64( ::serde_with::base64::Base64, ); impl SerializeAs for Base64 where T: AsRef<[u8]>, ALPHABET: Alphabet, { fn serialize_as(source: &T, serializer: S) -> Result where S: Serializer, { ::serde_with::base64::Base64::::serialize_as(source, serializer) } } impl SerializeAs for Base64 where T: AsRef<[u8]>, ALPHABET: Alphabet, { fn serialize_as(source: &T, serializer: S) -> Result where S: Serializer, { ::serde_with::base64::Base64::::serialize_as(source, serializer) } } impl<'de, T, ALPHABET, FORMAT> DeserializeAs<'de, T> for Base64 where T: TryFrom>, ALPHABET: Alphabet, FORMAT: Format, { fn deserialize_as(deserializer: D) -> Result where D: Deserializer<'de>, { ::serde_with::base64::Base64::::deserialize_as(deserializer) } } /// Helper type to implement `#[derive(Serialize, Deserialize)]`, /// as `#[near_bindgen]` doesn't support `#[serde(...)]` attributes on method arguments #[cfg_attr( all(feature = "abi", not(target_arch = "wasm32")), serde_as(schemars = true), derive(::near_sdk::schemars::JsonSchema), schemars(crate = "::near_sdk::schemars", transparent) )] #[cfg_attr( not(all(feature = "abi", not(target_arch = "wasm32"))), serde_as(schemars = false) )] #[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, From)] #[serde( crate = "::near_sdk::serde", bound(serialize = "T: AsRef<[u8]>", deserialize = "T: TryFrom>") )] pub struct AsBase64(#[serde_as(as = "Base64")] pub T); impl AsBase64 { #[inline] pub fn into_inner(self) -> T { self.0 } } #[cfg(all(feature = "abi", not(target_arch = "wasm32")))] const _: () = { use near_sdk::schemars::{ JsonSchema, r#gen::SchemaGenerator, schema::{InstanceType, Schema, SchemaObject}, }; use serde_with::schemars_0_8::JsonSchemaAs; impl JsonSchemaAs for Base64 where ALPHABET: Alphabet, FORMAT: Format, { fn schema_name() -> String { String::schema_name() } fn json_schema(_gen: &mut SchemaGenerator) -> Schema { // TODO: use #[schemars(extend(...))] when released SchemaObject { instance_type: Some(InstanceType::String.into()), extensions: [("contentEncoding", "base64".into())] .into_iter() .map(|(k, v)| (k.to_string(), v)) .collect(), ..Default::default() } .into() } fn is_referenceable() -> bool { false } } };