secret_toolkit_notification/
cbor.rs1use cosmwasm_std::{CanonicalAddr, StdError, StdResult};
2use minicbor::{data as cbor_data, encode as cbor_encode, Encoder};
3
4pub const CBL_ARRAY_SHORT: usize = 1;
6
7pub const CBL_ARRAY_MEDIUM: usize = 2;
9
10pub const CBL_ARRAY_LARGE: usize = 3;
12
13pub const CBL_U8_LESS_THAN_24: usize = 1;
15
16pub const CBL_U8: usize = 1 + 1;
18
19pub const CBL_U16: usize = 1 + 2;
21
22pub const CBL_U32: usize = 1 + 4;
24
25pub const CBL_U53: usize = 1 + 8;
27
28pub const CBL_BIGNUM_U64: usize = 1 + 1 + 8;
30
31pub const CBL_TIMESTAMP: usize = 1 + 1 + 8;
33
34pub const CBL_ADDRESS: usize = 1 + 20;
36
37pub fn cbor_to_std_error<T>(_e: cbor_encode::Error<T>) -> StdError {
39 StdError::generic_err("CBOR encoding error")
40}
41
42pub trait EncoderExt {
44 fn ext_tag(&mut self, tag: cbor_data::IanaTag) -> StdResult<&mut Self>;
45
46 fn ext_u8(&mut self, value: u8) -> StdResult<&mut Self>;
47 fn ext_u32(&mut self, value: u32) -> StdResult<&mut Self>;
48 fn ext_u64_from_u128(&mut self, value: u128) -> StdResult<&mut Self>;
49 fn ext_address(&mut self, value: CanonicalAddr) -> StdResult<&mut Self>;
50 fn ext_bytes(&mut self, value: &[u8]) -> StdResult<&mut Self>;
51 fn ext_timestamp(&mut self, value: u64) -> StdResult<&mut Self>;
52}
53
54impl<T: cbor_encode::Write> EncoderExt for Encoder<T> {
55 #[inline]
56 fn ext_tag(&mut self, tag: cbor_data::IanaTag) -> StdResult<&mut Self> {
57 self.tag(cbor_data::Tag::from(tag))
58 .map_err(cbor_to_std_error)
59 }
60
61 #[inline]
62 fn ext_u8(&mut self, value: u8) -> StdResult<&mut Self> {
63 self.u8(value).map_err(cbor_to_std_error)
64 }
65
66 #[inline]
67 fn ext_u32(&mut self, value: u32) -> StdResult<&mut Self> {
68 self.u32(value).map_err(cbor_to_std_error)
69 }
70
71 #[inline]
72 fn ext_u64_from_u128(&mut self, value: u128) -> StdResult<&mut Self> {
73 self.ext_tag(cbor_data::IanaTag::PosBignum)?
74 .ext_bytes(&value.to_be_bytes()[8..])
75 }
76
77 #[inline]
78 fn ext_address(&mut self, value: CanonicalAddr) -> StdResult<&mut Self> {
79 self.ext_bytes(value.as_slice())
80 }
81
82 #[inline]
83 fn ext_bytes(&mut self, value: &[u8]) -> StdResult<&mut Self> {
84 self.bytes(value).map_err(cbor_to_std_error)
85 }
86
87 #[inline]
88 fn ext_timestamp(&mut self, value: u64) -> StdResult<&mut Self> {
89 self.ext_tag(cbor_data::IanaTag::Timestamp)?
90 .u64(value)
91 .map_err(cbor_to_std_error)
92 }
93}