ssi_data_integrity/any/
options.rs

1use serde::{Deserialize, Serialize};
2use ssi_data_integrity_core::ProofOptions;
3use ssi_jwk::JWK;
4use ssi_verification_methods::AnyMethod;
5
6pub type AnyInputOptions = ProofOptions<AnyMethod, AnyInputSuiteOptions>;
7
8/// Suite-specific options for all cryptographic suites.
9#[derive(Debug, Clone, Default, Serialize, Deserialize)]
10#[serde(rename_all = "camelCase")]
11pub struct AnyInputSuiteOptions {
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub public_key_jwk: Option<Box<JWK>>,
14
15    #[cfg(all(feature = "w3c", feature = "eip712"))]
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub eip712: Option<ssi_data_integrity_suites::ethereum_eip712_signature_2021::Eip712Options>,
18}
19
20impl AnyInputSuiteOptions {
21    pub fn new() -> Self {
22        Self::default()
23    }
24
25    pub fn with_public_key(self, jwk: JWK) -> Result<Self, ssi_jws::Error> {
26        #[allow(clippy::needless_update)]
27        Ok(Self {
28            public_key_jwk: Some(Box::new(jwk)),
29            ..self
30        })
31    }
32}
33
34impl From<AnyInputSuiteOptions> for () {
35    fn from(_: AnyInputSuiteOptions) -> Self {}
36}
37
38impl From<()> for AnyInputSuiteOptions {
39    fn from(_: ()) -> Self {
40        Self::default()
41    }
42}
43
44#[cfg(all(feature = "w3c", feature = "eip712"))]
45impl From<Option<ssi_data_integrity_suites::ethereum_eip712_signature_2021::Eip712Options>>
46    for AnyInputSuiteOptions
47{
48    fn from(
49        value: Option<ssi_data_integrity_suites::ethereum_eip712_signature_2021::Eip712Options>,
50    ) -> Self {
51        Self {
52            eip712: value.clone(),
53            ..Default::default()
54        }
55    }
56}
57
58#[cfg(all(feature = "w3c", feature = "eip712"))]
59impl From<AnyInputSuiteOptions>
60    for ssi_data_integrity_suites::ethereum_eip712_signature_2021::Options
61{
62    fn from(value: AnyInputSuiteOptions) -> Self {
63        Self {
64            eip712: value.eip712,
65        }
66    }
67}
68
69#[cfg(all(feature = "w3c", feature = "eip712"))]
70impl From<ssi_data_integrity_suites::ethereum_eip712_signature_2021::Options>
71    for AnyInputSuiteOptions
72{
73    fn from(value: ssi_data_integrity_suites::ethereum_eip712_signature_2021::Options) -> Self {
74        Self {
75            eip712: value.eip712,
76            ..Default::default()
77        }
78    }
79}
80
81#[cfg(all(feature = "w3c", feature = "eip712"))]
82impl From<AnyInputSuiteOptions>
83    for ssi_data_integrity_suites::ethereum_eip712_signature_2021::v0_1::Options
84{
85    fn from(value: AnyInputSuiteOptions) -> Self {
86        Self {
87            eip712: value.eip712.map(Into::into),
88        }
89    }
90}
91
92#[cfg(all(feature = "w3c", feature = "eip712"))]
93impl From<ssi_data_integrity_suites::ethereum_eip712_signature_2021::v0_1::Options>
94    for AnyInputSuiteOptions
95{
96    fn from(
97        value: ssi_data_integrity_suites::ethereum_eip712_signature_2021::v0_1::Options,
98    ) -> Self {
99        Self {
100            eip712: value.eip712.map(Into::into),
101            ..Default::default()
102        }
103    }
104}
105
106#[cfg(feature = "tezos")]
107impl TryFrom<AnyInputSuiteOptions> for ssi_data_integrity_suites::tezos::Options {
108    type Error = ssi_data_integrity_core::suite::ConfigurationError;
109
110    fn try_from(value: AnyInputSuiteOptions) -> Result<Self, Self::Error> {
111        Ok(Self {
112            public_key_jwk: value.public_key_jwk.ok_or(
113                ssi_data_integrity_core::suite::ConfigurationError::MissingOption(
114                    "publicKeyJwk".to_string(),
115                ),
116            )?,
117        })
118    }
119}
120
121#[cfg(feature = "tezos")]
122impl From<ssi_data_integrity_suites::tezos::Options> for AnyInputSuiteOptions {
123    fn from(value: ssi_data_integrity_suites::tezos::Options) -> Self {
124        Self {
125            public_key_jwk: Some(value.public_key_jwk),
126            ..Default::default()
127        }
128    }
129}
130
131#[cfg(feature = "tezos")]
132impl TryFrom<AnyInputSuiteOptions> for ssi_data_integrity_suites::tezos_signature_2021::Options {
133    type Error = ssi_data_integrity_core::suite::ConfigurationError;
134
135    fn try_from(value: AnyInputSuiteOptions) -> Result<Self, Self::Error> {
136        Ok(Self {
137            public_key_jwk: value.public_key_jwk,
138        })
139    }
140}
141
142#[cfg(feature = "tezos")]
143impl From<ssi_data_integrity_suites::tezos_signature_2021::Options> for AnyInputSuiteOptions {
144    fn from(value: ssi_data_integrity_suites::tezos_signature_2021::Options) -> Self {
145        Self {
146            public_key_jwk: value.public_key_jwk,
147            ..Default::default()
148        }
149    }
150}
151
152#[cfg(feature = "tezos")]
153impl TryFrom<AnyInputSuiteOptions>
154    for ssi_data_integrity_suites::tezos::tezos_jcs_signature_2021::Options
155{
156    type Error = ssi_data_integrity_core::suite::ConfigurationError;
157
158    fn try_from(value: AnyInputSuiteOptions) -> Result<Self, Self::Error> {
159        Ok(Self {
160            public_key_multibase: value
161                .public_key_jwk
162                .as_deref()
163                .map(ssi_data_integrity_suites::tezos::encode_jwk_to_multibase)
164                .transpose()
165                .map_err(ssi_data_integrity_core::suite::ConfigurationError::other)?,
166        })
167    }
168}
169
170#[cfg(feature = "tezos")]
171impl From<ssi_data_integrity_suites::tezos::tezos_jcs_signature_2021::Options>
172    for AnyInputSuiteOptions
173{
174    fn from(value: ssi_data_integrity_suites::tezos::tezos_jcs_signature_2021::Options) -> Self {
175        Self {
176            public_key_jwk: value
177                .public_key_multibase
178                .and_then(|key| {
179                    ssi_data_integrity_suites::tezos::decode_jwk_from_multibase(&key).ok()
180                })
181                .map(Box::new),
182            ..Default::default()
183        }
184    }
185}