secure_gate/encoding/extensions/
bech32.rs1#[cfg(feature = "encoding-bech32")]
2#[allow(unused_imports)] use ::bech32::{decode, encode, Hrp};
4
5#[cfg(feature = "rand")]
6use crate::Bech32EncodingError;
7
8#[cfg(feature = "rand")]
13impl crate::DynamicRandom {
14 pub fn try_into_bech32(
22 self,
23 hrp: &str,
24 ) -> Result<crate::encoding::bech32::Bech32String, Bech32EncodingError> {
25 let hrp = Hrp::parse(hrp).map_err(|_| Bech32EncodingError::InvalidHrp)?;
26 let encoded = encode::<::bech32::Bech32>(hrp, self.expose_secret())
27 .map_err(|_| Bech32EncodingError::EncodingFailed)?;
28 Ok(crate::encoding::bech32::Bech32String::new_unchecked(
29 encoded,
30 crate::encoding::bech32::EncodingVariant::Bech32,
31 ))
32 }
33
34 pub fn try_into_bech32m(
42 self,
43 hrp: &str,
44 ) -> Result<crate::encoding::bech32::Bech32String, Bech32EncodingError> {
45 let hrp = Hrp::parse(hrp).map_err(|_| Bech32EncodingError::InvalidHrp)?;
46 let encoded = encode::<::bech32::Bech32m>(hrp, self.expose_secret())
47 .map_err(|_| Bech32EncodingError::EncodingFailed)?;
48 Ok(crate::encoding::bech32::Bech32String::new_unchecked(
49 encoded,
50 crate::encoding::bech32::EncodingVariant::Bech32m,
51 ))
52 }
53}
54
55#[cfg(feature = "rand")]
56impl<const N: usize> crate::FixedRandom<N> {
57 pub fn try_into_bech32(
65 self,
66 hrp: &str,
67 ) -> Result<crate::encoding::bech32::Bech32String, Bech32EncodingError> {
68 let hrp = Hrp::parse(hrp).map_err(|_| Bech32EncodingError::InvalidHrp)?;
69 let encoded = encode::<::bech32::Bech32>(hrp, self.expose_secret())
70 .map_err(|_| Bech32EncodingError::EncodingFailed)?;
71 Ok(crate::encoding::bech32::Bech32String::new_unchecked(
72 encoded,
73 crate::encoding::bech32::EncodingVariant::Bech32,
74 ))
75 }
76
77 pub fn try_into_bech32m(
85 self,
86 hrp: &str,
87 ) -> Result<crate::encoding::bech32::Bech32String, Bech32EncodingError> {
88 let hrp = Hrp::parse(hrp).map_err(|_| Bech32EncodingError::InvalidHrp)?;
89 let encoded = encode::<::bech32::Bech32m>(hrp, self.expose_secret())
90 .map_err(|_| Bech32EncodingError::EncodingFailed)?;
91 Ok(crate::encoding::bech32::Bech32String::new_unchecked(
92 encoded,
93 crate::encoding::bech32::EncodingVariant::Bech32m,
94 ))
95 }
96}
97
98#[cfg(feature = "rand")]
103impl<const N: usize> crate::FixedRandom<N> {
104 pub fn try_to_bech32(
112 &self,
113 hrp: &str,
114 ) -> Result<crate::encoding::bech32::Bech32String, Bech32EncodingError> {
115 let hrp = Hrp::parse(hrp).map_err(|_| Bech32EncodingError::InvalidHrp)?;
116 let encoded = encode::<::bech32::Bech32>(hrp, self.expose_secret())
117 .map_err(|_| Bech32EncodingError::EncodingFailed)?;
118 Ok(crate::encoding::bech32::Bech32String::new_unchecked(
119 encoded,
120 crate::encoding::bech32::EncodingVariant::Bech32,
121 ))
122 }
123
124 pub fn try_to_bech32m(
132 &self,
133 hrp: &str,
134 ) -> Result<crate::encoding::bech32::Bech32String, Bech32EncodingError> {
135 let hrp = Hrp::parse(hrp).map_err(|_| Bech32EncodingError::InvalidHrp)?;
136 let encoded = encode::<::bech32::Bech32m>(hrp, self.expose_secret())
137 .map_err(|_| Bech32EncodingError::EncodingFailed)?;
138 Ok(crate::encoding::bech32::Bech32String::new_unchecked(
139 encoded,
140 crate::encoding::bech32::EncodingVariant::Bech32m,
141 ))
142 }
143}
144
145#[cfg(feature = "rand")]
146impl crate::DynamicRandom {
147 pub fn try_to_bech32(
155 &self,
156 hrp: &str,
157 ) -> Result<crate::encoding::bech32::Bech32String, Bech32EncodingError> {
158 let hrp = Hrp::parse(hrp).map_err(|_| Bech32EncodingError::InvalidHrp)?;
159 let encoded = encode::<::bech32::Bech32>(hrp, self.expose_secret())
160 .map_err(|_| Bech32EncodingError::EncodingFailed)?;
161 Ok(crate::encoding::bech32::Bech32String::new_unchecked(
162 encoded,
163 crate::encoding::bech32::EncodingVariant::Bech32,
164 ))
165 }
166
167 pub fn try_to_bech32m(
175 &self,
176 hrp: &str,
177 ) -> Result<crate::encoding::bech32::Bech32String, Bech32EncodingError> {
178 let hrp = Hrp::parse(hrp).map_err(|_| Bech32EncodingError::InvalidHrp)?;
179 let encoded = encode::<::bech32::Bech32m>(hrp, self.expose_secret())
180 .map_err(|_| Bech32EncodingError::EncodingFailed)?;
181 Ok(crate::encoding::bech32::Bech32String::new_unchecked(
182 encoded,
183 crate::encoding::bech32::EncodingVariant::Bech32m,
184 ))
185 }
186}
187
188pub struct Bech32StringView<'a>(pub(crate) &'a String);
194
195impl<'a> Bech32StringView<'a> {
196 pub fn to_bytes(&self) -> Vec<u8> {
198 let (_, data) = decode(self.0.as_str()).expect("Bech32String is always valid");
199 data
200 }
201}
202
203impl<'a> core::ops::Deref for Bech32StringView<'a> {
204 type Target = str;
205 fn deref(&self) -> &Self::Target {
206 self.0.as_str()
207 }
208}
209
210impl<'a> core::fmt::Debug for Bech32StringView<'a> {
211 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
212 f.write_str("[REDACTED]")
213 }
214}
215
216impl<'a> core::fmt::Display for Bech32StringView<'a> {
217 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
218 f.write_str(self.0)
219 }
220}
221
222impl<'a> core::cmp::PartialEq<&str> for Bech32StringView<'a> {
223 fn eq(&self, other: &&str) -> bool {
224 self.0 == *other
225 }
226}
227
228impl crate::encoding::bech32::Bech32String {
233 pub fn expose_secret(&self) -> Bech32StringView<'_> {
234 Bech32StringView(self.inner.expose_secret())
235 }
236}