Skip to main content

ssi_data_integrity_core/suite/
bounds.rs

1use core::fmt;
2use std::fmt::Debug;
3
4use serde::{Deserializer, Serialize, Serializer};
5use ssi_core::de::DeserializeTyped;
6use ssi_verification_methods::{ReferenceOrOwned, ReferenceOrOwnedRef};
7
8use crate::Type;
9
10use super::CryptographicSuite;
11
12pub trait DebugCryptographicSuite: CryptographicSuite + Debug {
13    fn fmt_prepared_claims(claims: &Self::PreparedClaims, f: &mut fmt::Formatter) -> fmt::Result;
14
15    fn fmt_verification_method(
16        verification_method: &Self::VerificationMethod,
17        f: &mut fmt::Formatter,
18    ) -> fmt::Result;
19
20    fn fmt_verification_method_ref(
21        verification_method: &ReferenceOrOwnedRef<Self::VerificationMethod>,
22        f: &mut fmt::Formatter,
23    ) -> fmt::Result;
24
25    fn fmt_proof_options(options: &Self::ProofOptions, f: &mut fmt::Formatter) -> fmt::Result;
26
27    fn fmt_signature(signature: &Self::Signature, f: &mut fmt::Formatter) -> fmt::Result;
28}
29
30impl<S: CryptographicSuite + Debug> DebugCryptographicSuite for S
31where
32    Self::PreparedClaims: Debug,
33    Self::VerificationMethod: Debug,
34    Self::ProofOptions: Debug,
35    Self::Signature: Debug,
36{
37    fn fmt_prepared_claims(claims: &Self::PreparedClaims, f: &mut fmt::Formatter) -> fmt::Result {
38        claims.fmt(f)
39    }
40
41    fn fmt_verification_method(
42        verification_method: &Self::VerificationMethod,
43        f: &mut fmt::Formatter,
44    ) -> fmt::Result {
45        verification_method.fmt(f)
46    }
47
48    fn fmt_verification_method_ref(
49        verification_method: &ReferenceOrOwnedRef<Self::VerificationMethod>,
50        f: &mut fmt::Formatter,
51    ) -> fmt::Result {
52        verification_method.fmt(f)
53    }
54
55    fn fmt_proof_options(options: &Self::ProofOptions, f: &mut fmt::Formatter) -> fmt::Result {
56        options.fmt(f)
57    }
58
59    fn fmt_signature(signature: &Self::Signature, f: &mut fmt::Formatter) -> fmt::Result {
60        signature.fmt(f)
61    }
62}
63
64pub trait CloneCryptographicSuite: CryptographicSuite {
65    fn clone_prepared_claims(claims: &Self::PreparedClaims) -> Self::PreparedClaims;
66
67    fn clone_verification_method(
68        verification_method: &Self::VerificationMethod,
69    ) -> Self::VerificationMethod;
70
71    fn clone_verification_method_ref(
72        verification_method: &ReferenceOrOwned<Self::VerificationMethod>,
73    ) -> ReferenceOrOwned<Self::VerificationMethod>;
74
75    fn clone_verification_method_ref_ref(
76        verification_method: ReferenceOrOwnedRef<Self::VerificationMethod>,
77    ) -> ReferenceOrOwned<Self::VerificationMethod>;
78
79    fn clone_proof_options(options: &Self::ProofOptions) -> Self::ProofOptions;
80
81    fn clone_signature(signature: &Self::Signature) -> Self::Signature;
82}
83
84impl<S: CryptographicSuite> CloneCryptographicSuite for S
85where
86    Self::PreparedClaims: Clone,
87    Self::VerificationMethod: Clone,
88    Self::ProofOptions: Clone,
89    Self::Signature: Clone,
90{
91    fn clone_prepared_claims(claims: &Self::PreparedClaims) -> Self::PreparedClaims {
92        claims.clone()
93    }
94
95    fn clone_verification_method(
96        verification_method: &Self::VerificationMethod,
97    ) -> Self::VerificationMethod {
98        verification_method.clone()
99    }
100
101    fn clone_verification_method_ref(
102        verification_method: &ReferenceOrOwned<Self::VerificationMethod>,
103    ) -> ReferenceOrOwned<Self::VerificationMethod> {
104        verification_method.clone()
105    }
106
107    fn clone_verification_method_ref_ref(
108        verification_method: ReferenceOrOwnedRef<Self::VerificationMethod>,
109    ) -> ReferenceOrOwned<Self::VerificationMethod> {
110        verification_method.cloned()
111    }
112
113    fn clone_proof_options(options: &Self::ProofOptions) -> Self::ProofOptions {
114        options.clone()
115    }
116
117    fn clone_signature(signature: &Self::Signature) -> Self::Signature {
118        signature.clone()
119    }
120}
121
122pub trait SerializeCryptographicSuite: CryptographicSuite {
123    fn serialize_type<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
124        self.type_().serialize(serializer)
125    }
126
127    fn serialize_verification_method<S: Serializer>(
128        verification_method: &Self::VerificationMethod,
129        serializer: S,
130    ) -> Result<S::Ok, S::Error>;
131
132    fn serialize_verification_method_ref<S: Serializer>(
133        verification_method: &ReferenceOrOwned<Self::VerificationMethod>,
134        serializer: S,
135    ) -> Result<S::Ok, S::Error>;
136
137    fn serialize_verification_method_ref_ref<S: Serializer>(
138        verification_method: &ReferenceOrOwnedRef<Self::VerificationMethod>,
139        serializer: S,
140    ) -> Result<S::Ok, S::Error>;
141
142    fn serialize_proof_options<S: Serializer>(
143        proof_options: &Self::ProofOptions,
144        serializer: S,
145    ) -> Result<S::Ok, S::Error>;
146
147    fn serialize_signature<S: Serializer>(
148        signature: &Self::Signature,
149        serializer: S,
150    ) -> Result<S::Ok, S::Error>;
151}
152
153impl<T: CryptographicSuite> SerializeCryptographicSuite for T
154where
155    Self::VerificationMethod: Serialize,
156    Self::ProofOptions: Serialize,
157    Self::Signature: Serialize,
158{
159    fn serialize_verification_method<S: Serializer>(
160        verification_method: &Self::VerificationMethod,
161        serializer: S,
162    ) -> Result<S::Ok, S::Error> {
163        verification_method.serialize(serializer)
164    }
165
166    fn serialize_verification_method_ref<S: Serializer>(
167        verification_method: &ReferenceOrOwned<Self::VerificationMethod>,
168        serializer: S,
169    ) -> Result<S::Ok, S::Error> {
170        verification_method.serialize(serializer)
171    }
172
173    fn serialize_verification_method_ref_ref<S: Serializer>(
174        verification_method: &ReferenceOrOwnedRef<Self::VerificationMethod>,
175        serializer: S,
176    ) -> Result<S::Ok, S::Error> {
177        verification_method.serialize(serializer)
178    }
179
180    fn serialize_proof_options<S: Serializer>(
181        proof_options: &Self::ProofOptions,
182        serializer: S,
183    ) -> Result<S::Ok, S::Error> {
184        proof_options.serialize(serializer)
185    }
186
187    fn serialize_signature<S: Serializer>(
188        signature: &Self::Signature,
189        serializer: S,
190    ) -> Result<S::Ok, S::Error> {
191        signature.serialize(serializer)
192    }
193}
194
195pub trait DeserializeCryptographicSuite<'de>: CryptographicSuite + TryFrom<Type> {
196    fn deserialize_verification_method<D: Deserializer<'de>>(
197        &self,
198        deserializer: D,
199    ) -> Result<Self::VerificationMethod, D::Error>;
200
201    fn deserialize_proof_options<D: Deserializer<'de>>(
202        &self,
203        deserializer: D,
204    ) -> Result<Self::ProofOptions, D::Error>;
205
206    fn deserialize_signature<D: Deserializer<'de>>(
207        &self,
208        deserializer: D,
209    ) -> Result<Self::Signature, D::Error>;
210}
211
212impl<'de, S: CryptographicSuite + TryFrom<Type>> DeserializeCryptographicSuite<'de> for S
213where
214    Self::VerificationMethod: DeserializeTyped<'de, S>,
215    Self::ProofOptions: DeserializeTyped<'de, S>,
216    Self::Signature: DeserializeTyped<'de, S>,
217{
218    fn deserialize_verification_method<D: Deserializer<'de>>(
219        &self,
220        deserializer: D,
221    ) -> Result<Self::VerificationMethod, D::Error> {
222        Self::VerificationMethod::deserialize_typed(self, deserializer)
223    }
224
225    fn deserialize_proof_options<D: Deserializer<'de>>(
226        &self,
227        deserializer: D,
228    ) -> Result<Self::ProofOptions, D::Error> {
229        Self::ProofOptions::deserialize_typed(self, deserializer)
230    }
231
232    fn deserialize_signature<D: Deserializer<'de>>(
233        &self,
234        deserializer: D,
235    ) -> Result<Self::Signature, D::Error> {
236        Self::Signature::deserialize_typed(self, deserializer)
237    }
238}
239
240pub trait DeserializeCryptographicSuiteOwned:
241    CryptographicSuite + for<'de> DeserializeCryptographicSuite<'de>
242{
243}
244
245impl<S> DeserializeCryptographicSuiteOwned for S where S: for<'de> DeserializeCryptographicSuite<'de>
246{}
247
248pub struct VerificationMethodOf<S: CryptographicSuite>(pub S::VerificationMethod);
249
250impl<S: CryptographicSuite> VerificationMethodOf<S> {
251    pub fn unwrap(self) -> S::VerificationMethod {
252        self.0
253    }
254}
255
256impl<'de, T: DeserializeCryptographicSuite<'de>> DeserializeTyped<'de, T>
257    for VerificationMethodOf<T>
258{
259    fn deserialize_typed<S>(type_: &T, deserializer: S) -> Result<Self, S::Error>
260    where
261        S: serde::Deserializer<'de>,
262    {
263        type_
264            .deserialize_verification_method(deserializer)
265            .map(Self)
266    }
267}
268
269pub struct VerificationMethodRefOf<'a, S: CryptographicSuite>(
270    pub ReferenceOrOwnedRef<'a, S::VerificationMethod>,
271);
272
273impl<S: DebugCryptographicSuite> fmt::Debug for VerificationMethodRefOf<'_, S> {
274    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
275        S::fmt_verification_method_ref(&self.0, f)
276    }
277}
278
279pub struct OptionsOf<S: CryptographicSuite>(pub S::ProofOptions);
280
281impl<'de, T: DeserializeCryptographicSuite<'de>> DeserializeTyped<'de, T> for OptionsOf<T> {
282    fn deserialize_typed<S>(type_: &T, deserializer: S) -> Result<Self, S::Error>
283    where
284        S: serde::Deserializer<'de>,
285    {
286        type_.deserialize_proof_options(deserializer).map(Self)
287    }
288}
289
290pub struct OptionsRefOf<'a, S: CryptographicSuite>(pub &'a S::ProofOptions);
291
292impl<S: DebugCryptographicSuite> fmt::Debug for OptionsRefOf<'_, S> {
293    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
294        S::fmt_proof_options(self.0, f)
295    }
296}
297
298pub struct SignatureOf<S: CryptographicSuite>(pub S::Signature);
299
300impl<'de, T: DeserializeCryptographicSuite<'de>> DeserializeTyped<'de, T> for SignatureOf<T> {
301    fn deserialize_typed<S>(type_: &T, deserializer: S) -> Result<Self, S::Error>
302    where
303        S: serde::Deserializer<'de>,
304    {
305        type_.deserialize_signature(deserializer).map(Self)
306    }
307}
308
309pub struct SignatureRefOf<'a, S: CryptographicSuite>(pub &'a S::Signature);
310
311impl<S: DebugCryptographicSuite> fmt::Debug for SignatureRefOf<'_, S> {
312    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
313        S::fmt_signature(self.0, f)
314    }
315}