1mod conversion;
2#[cfg(feature = "random-identities")]
3pub mod random;
4
5#[cfg(feature = "json-conversion")]
6use crate::serialization::json_safe_fields;
7#[cfg(feature = "value-conversion")]
8use crate::serialization::ValueConvertible;
9use std::collections::BTreeMap;
10#[cfg(feature = "value-conversion")]
11use std::convert::TryFrom;
12use std::hash::{Hash, Hasher};
13
14use crate::identity::{IdentityPublicKey, KeyID, PartialIdentity};
15use crate::prelude::Revision;
16#[cfg(feature = "value-conversion")]
17use platform_value::Value;
18
19#[cfg(feature = "value-conversion")]
20use crate::errors::ProtocolError;
21use crate::identifier::Identifier;
22#[cfg(feature = "identity-serialization")]
23use bincode::{Decode, Encode};
24
25#[cfg_attr(feature = "json-conversion", json_safe_fields)]
28#[derive(Default, Debug, Clone, Eq, PartialEq)]
29#[cfg_attr(feature = "identity-serialization", derive(Encode, Decode))]
30#[cfg_attr(
31 any(feature = "serde-conversion", feature = "serde-conversion"),
32 derive(serde::Serialize, serde::Deserialize),
33 serde(rename_all = "camelCase")
34)]
35#[cfg_attr(feature = "value-conversion", derive(ValueConvertible))]
36pub struct IdentityV0 {
37 pub id: Identifier,
38 #[cfg_attr(
39 any(feature = "serde-conversion", feature = "serde-conversion"),
40 serde(with = "public_key_serialization")
41 )]
42 pub public_keys: BTreeMap<KeyID, IdentityPublicKey>,
43 pub balance: u64,
44 pub revision: Revision,
45}
46
47impl Hash for IdentityV0 {
48 fn hash<H: Hasher>(&self, state: &mut H) {
49 self.id.hash(state);
50 }
51}
52
53mod public_key_serialization {
54 use crate::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0;
55 use crate::identity::{IdentityPublicKey, KeyID};
56 use serde::ser::SerializeSeq;
57 use serde::{Deserialize, Serializer};
58 use std::collections::BTreeMap;
59
60 pub fn deserialize<'de, D>(
62 deserializer: D,
63 ) -> Result<BTreeMap<KeyID, IdentityPublicKey>, D::Error>
64 where
65 D: serde::Deserializer<'de>,
66 {
67 let public_key_vec: Vec<IdentityPublicKey> = Deserialize::deserialize(deserializer)?;
68 Ok(public_key_vec.into_iter().map(|k| (k.id(), k)).collect())
69 }
70
71 pub fn serialize<S>(
72 public_keys: &BTreeMap<KeyID, IdentityPublicKey>,
73 serializer: S,
74 ) -> Result<S::Ok, S::Error>
75 where
76 S: Serializer,
77 {
78 let mut seq = serializer.serialize_seq(Some(public_keys.len()))?;
79 for element in public_keys.values() {
80 seq.serialize_element(element)?;
81 }
82 seq.end()
83 }
84}
85
86impl IdentityV0 {
87 pub fn get_feature_version(&self) -> u16 {
89 0
90 }
91
92 pub fn into_partial_identity_info(self) -> PartialIdentity {
94 let Self {
95 id,
96 public_keys,
97 balance,
98 revision,
99 ..
100 } = self;
101 PartialIdentity {
102 id,
103 loaded_public_keys: public_keys,
104 balance: Some(balance),
105 revision: Some(revision),
106 not_found_public_keys: Default::default(),
107 }
108 }
109
110 pub fn into_partial_identity_info_no_balance(self) -> PartialIdentity {
112 let Self {
113 id,
114 public_keys,
115 revision,
116 ..
117 } = self;
118 PartialIdentity {
119 id,
120 loaded_public_keys: public_keys,
121 balance: None,
122 revision: Some(revision),
123 not_found_public_keys: Default::default(),
124 }
125 }
126}
127
128#[cfg(feature = "value-conversion")]
129impl TryFrom<Value> for IdentityV0 {
130 type Error = ProtocolError;
131
132 fn try_from(value: Value) -> Result<Self, Self::Error> {
133 platform_value::from_value(value).map_err(ProtocolError::ValueError)
134 }
135}
136
137#[cfg(feature = "value-conversion")]
138impl TryFrom<&Value> for IdentityV0 {
139 type Error = ProtocolError;
140
141 fn try_from(value: &Value) -> Result<Self, Self::Error> {
142 platform_value::from_value(value.clone()).map_err(ProtocolError::ValueError)
143 }
144}