use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, Default, Deserialize, Eq, Hash, PartialEq, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum SigningScheme {
#[default]
Eip712,
EthSign,
Eip1271,
PreSign,
}
impl SigningScheme {
pub const fn try_to_ecdsa_scheme(self) -> Option<EcdsaSigningScheme> {
match self {
Self::Eip712 => Some(EcdsaSigningScheme::Eip712),
Self::EthSign => Some(EcdsaSigningScheme::EthSign),
Self::Eip1271 | Self::PreSign => None,
}
}
pub const fn is_ecdsa(self) -> bool {
self.try_to_ecdsa_scheme().is_some()
}
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum EcdsaSigningScheme {
Eip712,
EthSign,
}
impl From<EcdsaSigningScheme> for SigningScheme {
fn from(scheme: EcdsaSigningScheme) -> Self {
match scheme {
EcdsaSigningScheme::Eip712 => Self::Eip712,
EcdsaSigningScheme::EthSign => Self::EthSign,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn wire_form_is_lowercase() {
for (scheme, expected) in [
(SigningScheme::Eip712, "\"eip712\""),
(SigningScheme::EthSign, "\"ethsign\""),
(SigningScheme::Eip1271, "\"eip1271\""),
(SigningScheme::PreSign, "\"presign\""),
] {
let serialised = serde_json::to_string(&scheme).unwrap();
assert_eq!(serialised, expected);
let parsed: SigningScheme = serde_json::from_str(expected).unwrap();
assert_eq!(parsed, scheme);
}
}
}