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