iota_json_rpc_types/
iota_owner.rs1use iota_types::{
5 base_types::{IotaAddress, ObjectID, SequenceNumber},
6 object::Owner,
7};
8use schemars::JsonSchema;
9use serde::{Deserialize, Serialize};
10use serde_with::{DeserializeAs, SerializeAs, serde_as};
11
12use crate::iota_primitives::{
13 IotaAddress as IotaAddressSchema, SequenceNumberU64 as SequenceNumberU64Schema,
14};
15
16#[serde_as]
31#[derive(Serialize, Deserialize, JsonSchema)]
32#[serde(rename = "Owner")]
33pub enum OwnerSchema {
34 #[schemars(with = "IotaAddressSchema")]
36 AddressOwner(IotaAddress),
37 #[schemars(with = "IotaAddressSchema")]
41 ObjectOwner(IotaAddress),
42 Shared {
44 #[schemars(with = "SequenceNumberU64Schema")]
46 initial_shared_version: SequenceNumber,
47 },
48 Immutable,
50}
51
52impl SerializeAs<Owner> for OwnerSchema {
53 fn serialize_as<S>(source: &Owner, serializer: S) -> Result<S::Ok, S::Error>
54 where
55 S: serde::Serializer,
56 {
57 OwnerSchema::from(*source).serialize(serializer)
58 }
59}
60
61impl<'de> DeserializeAs<'de, Owner> for OwnerSchema {
62 fn deserialize_as<D>(deserializer: D) -> Result<Owner, D::Error>
63 where
64 D: serde::Deserializer<'de>,
65 {
66 let iota_owner = OwnerSchema::deserialize(deserializer)?;
67 Ok(Owner::from(iota_owner))
68 }
69}
70
71impl std::fmt::Display for OwnerSchema {
72 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
73 match self {
74 Self::AddressOwner(address) => {
75 write!(f, "Account Address ( {address} )")
76 }
77 Self::ObjectOwner(address) => {
78 write!(f, "Object ID: ( {address} )")
79 }
80 Self::Immutable => {
81 write!(f, "Immutable")
82 }
83 Self::Shared {
84 initial_shared_version,
85 } => {
86 write!(f, "Shared( {initial_shared_version} )")
87 }
88 }
89 }
90}
91
92impl From<Owner> for OwnerSchema {
93 fn from(value: Owner) -> Self {
94 match value {
95 Owner::Address(address) => OwnerSchema::AddressOwner(address),
96 Owner::Object(object_id) => OwnerSchema::ObjectOwner(*object_id.as_address()),
97 Owner::Shared(initial_shared_version) => OwnerSchema::Shared {
98 initial_shared_version,
99 },
100 Owner::Immutable => OwnerSchema::Immutable,
101 _ => unimplemented!("a new Owner enum variant was added and needs to be handled"),
102 }
103 }
104}
105
106impl From<OwnerSchema> for Owner {
107 fn from(value: OwnerSchema) -> Self {
108 match value {
109 OwnerSchema::AddressOwner(address) => Owner::Address(address),
110 OwnerSchema::ObjectOwner(address) => Owner::Object(ObjectID::from(address)),
111 OwnerSchema::Shared {
112 initial_shared_version,
113 } => Owner::Shared(initial_shared_version),
114 OwnerSchema::Immutable => Owner::Immutable,
115 }
116 }
117}