Skip to main content

dpp/identity/identity_public_key/conversion/json/
mod.rs

1mod v0;
2use crate::identity::identity_public_key::v0::IdentityPublicKeyV0;
3use crate::identity::IdentityPublicKey;
4use crate::version::PlatformVersion;
5use crate::ProtocolError;
6use serde_json::Value as JsonValue;
7pub use v0::IdentityPublicKeyJsonConversionMethodsV0;
8
9impl IdentityPublicKeyJsonConversionMethodsV0 for IdentityPublicKey {
10    fn to_json(&self) -> Result<JsonValue, ProtocolError> {
11        match self {
12            IdentityPublicKey::V0(key) => key.to_json(),
13        }
14    }
15
16    fn to_json_object(&self) -> Result<JsonValue, ProtocolError> {
17        match self {
18            IdentityPublicKey::V0(key) => key.to_json_object(),
19        }
20    }
21
22    fn from_json_object(
23        raw_object: JsonValue,
24        platform_version: &PlatformVersion,
25    ) -> Result<Self, ProtocolError>
26    where
27        Self: Sized,
28    {
29        match platform_version
30            .dpp
31            .identity_versions
32            .identity_key_structure_version
33        {
34            0 => {
35                IdentityPublicKeyV0::from_json_object(raw_object, platform_version).map(Into::into)
36            }
37            version => Err(ProtocolError::UnknownVersionMismatch {
38                method: "IdentityPublicKey::from_json_object".to_string(),
39                known_versions: vec![0],
40                received: version,
41            }),
42        }
43    }
44}
45
46#[cfg(test)]
47mod tests {
48    use super::*;
49    use crate::identity::identity_public_key::v0::IdentityPublicKeyV0;
50    use crate::identity::{KeyType, Purpose, SecurityLevel};
51    use platform_value::BinaryData;
52    use platform_version::version::LATEST_PLATFORM_VERSION;
53
54    fn wrapper(disabled_at: Option<u64>) -> IdentityPublicKey {
55        IdentityPublicKey::V0(IdentityPublicKeyV0 {
56            id: 2,
57            purpose: Purpose::AUTHENTICATION,
58            security_level: SecurityLevel::MASTER,
59            contract_bounds: None,
60            key_type: KeyType::ECDSA_SECP256K1,
61            read_only: false,
62            data: BinaryData::new(vec![0x77; 33]),
63            disabled_at,
64        })
65    }
66
67    #[test]
68    fn to_json_delegates_to_v0() {
69        let key = wrapper(None);
70        let json = key.to_json().expect("to_json");
71        let IdentityPublicKey::V0(inner) = &key;
72        assert_eq!(json, inner.to_json().unwrap());
73    }
74
75    #[test]
76    fn to_json_object_delegates_to_v0() {
77        let key = wrapper(None);
78        let json = key.to_json_object().expect("to_json_object");
79        let IdentityPublicKey::V0(inner) = &key;
80        assert_eq!(json, inner.to_json_object().unwrap());
81    }
82
83    #[test]
84    fn from_json_object_roundtrip() {
85        let key = wrapper(Some(1234));
86        let json = key.to_json().expect("to_json");
87        let back = IdentityPublicKey::from_json_object(json, LATEST_PLATFORM_VERSION).unwrap();
88        assert_eq!(back, key);
89    }
90
91    #[test]
92    fn from_json_object_missing_fields_errors() {
93        let json = serde_json::json!({ "id": 0 });
94        let result = IdentityPublicKey::from_json_object(json, LATEST_PLATFORM_VERSION);
95        assert!(result.is_err());
96    }
97}