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;