sui_sdk_types/
bcs.rs

1pub use bcs::Error;
2
3pub trait FromBcs {
4    fn from_bcs<'de>(bytes: &'de [u8]) -> Result<Self, Error>
5    where
6        Self: serde::de::Deserialize<'de>,
7    {
8        bcs::from_bytes(bytes)
9    }
10
11    fn from_bcs_base64(base64: &str) -> Result<Self, Error>
12    where
13        Self: serde::de::DeserializeOwned,
14    {
15        let bytes = <base64ct::Base64 as base64ct::Encoding>::decode_vec(base64)
16            .map_err(|e| bcs::Error::Custom(format!("invalid base64: {e}")))?;
17        Self::from_bcs(&bytes)
18    }
19}
20
21impl<'de, T> FromBcs for T where T: serde::de::Deserialize<'de> {}
22
23pub trait ToBcs: serde::ser::Serialize {
24    fn to_bcs(&self) -> Result<Vec<u8>, Error> {
25        bcs::to_bytes(self)
26    }
27
28    fn to_bcs_base64(&self) -> Result<String, Error> {
29        let bytes = self.to_bcs()?;
30        Ok(<base64ct::Base64 as base64ct::Encoding>::encode_string(
31            &bytes,
32        ))
33    }
34}
35
36impl<T> ToBcs for T where T: serde::ser::Serialize {}
37
38// Maybe have a name trait?
39// pub trait BcsName;