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