multiversx_sc_meta_lib/abi_json/
endpoint_abi_json.rs1use multiversx_sc::abi::*;
2use serde::{Deserialize, Serialize};
3
4#[derive(Serialize, Deserialize)]
5pub struct InputAbiJson {
6 #[serde(rename = "name")]
7 pub arg_name: String,
8
9 #[serde(rename = "type")]
10 pub type_name: String,
11
12 #[serde(default)]
14 #[serde(skip_serializing_if = "Option::is_none")]
15 pub multi_arg: Option<bool>,
16}
17
18impl From<&InputAbi> for InputAbiJson {
19 fn from(abi: &InputAbi) -> Self {
20 InputAbiJson {
21 arg_name: abi.arg_name.to_string(),
22 type_name: abi.type_names.abi.clone(),
23 multi_arg: if abi.multi_arg { Some(true) } else { None },
24 }
25 }
26}
27
28impl From<&InputAbiJson> for InputAbi {
29 fn from(abi: &InputAbiJson) -> Self {
30 InputAbi {
31 arg_name: abi.arg_name.to_string(),
32 type_names: TypeNames::from_abi(abi.type_name.clone()),
33 multi_arg: abi.multi_arg.unwrap_or(false),
34 }
35 }
36}
37
38impl From<InputAbiJson> for InputAbi {
39 fn from(abi: InputAbiJson) -> Self {
40 InputAbi::from(&abi)
41 }
42}
43
44#[derive(Serialize, Deserialize)]
45pub struct OutputAbiJson {
46 #[serde(rename = "name")]
47 #[serde(default)]
48 #[serde(skip_serializing_if = "String::is_empty")]
49 pub output_name: String,
50 #[serde(rename = "type")]
51 pub type_name: String,
52 #[serde(default)]
54 #[serde(skip_serializing_if = "Option::is_none")]
55 pub multi_result: Option<bool>,
56}
57
58impl From<&OutputAbi> for OutputAbiJson {
59 fn from(abi: &OutputAbi) -> Self {
60 OutputAbiJson {
61 output_name: abi.output_name.clone(),
62 type_name: abi.type_names.abi.clone(),
63 multi_result: if abi.multi_result { Some(true) } else { None },
64 }
65 }
66}
67
68impl From<&OutputAbiJson> for OutputAbi {
69 fn from(abi: &OutputAbiJson) -> Self {
70 OutputAbi {
71 output_name: abi.output_name.clone(),
72 type_names: TypeNames::from_abi(abi.type_name.clone()),
73 multi_result: abi.multi_result.unwrap_or(false),
74 }
75 }
76}
77
78impl From<OutputAbiJson> for OutputAbi {
79 fn from(abi: OutputAbiJson) -> Self {
80 OutputAbi::from(&abi)
81 }
82}
83
84#[derive(Serialize, Deserialize, Default)]
85#[serde(rename_all = "camelCase")]
86pub enum EndpointMutabilityAbiJson {
87 #[default]
88 Mutable,
89 Readonly,
90 Pure,
91}
92
93#[derive(Serialize, Deserialize)]
95pub struct ConstructorAbiJson {
96 #[serde(default)]
97 #[serde(skip_serializing_if = "Vec::is_empty")]
98 pub docs: Vec<String>,
99 #[serde(rename = "payableInTokens")]
100 #[serde(default)]
101 #[serde(skip_serializing_if = "Vec::is_empty")]
102 pub payable_in_tokens: Vec<String>,
103 pub inputs: Vec<InputAbiJson>,
104 pub outputs: Vec<OutputAbiJson>,
105}
106
107impl From<&EndpointAbi> for ConstructorAbiJson {
108 fn from(abi: &EndpointAbi) -> Self {
109 ConstructorAbiJson {
110 docs: abi.docs.iter().map(|d| d.to_string()).collect(),
111 payable_in_tokens: abi
112 .payable_in_tokens
113 .iter()
114 .map(|d| d.to_string())
115 .collect(),
116 inputs: abi.inputs.iter().map(InputAbiJson::from).collect(),
117 outputs: abi.outputs.iter().map(OutputAbiJson::from).collect(),
118 }
119 }
120}
121
122#[derive(Serialize, Deserialize)]
123pub struct EndpointAbiJson {
124 #[serde(default)]
125 #[serde(skip_serializing_if = "Vec::is_empty")]
126 pub docs: Vec<String>,
127 pub name: String,
128
129 #[serde(default)]
130 #[serde(skip_serializing_if = "Option::is_none")]
131 pub title: Option<String>,
132
133 #[serde(rename = "onlyOwner")]
134 #[serde(default)]
135 #[serde(skip_serializing_if = "Option::is_none")]
136 pub only_owner: Option<bool>,
137
138 #[serde(rename = "onlyAdmin")]
139 #[serde(default)]
140 #[serde(skip_serializing_if = "Option::is_none")]
141 pub only_admin: Option<bool>,
142
143 #[serde(default)]
144 pub mutability: EndpointMutabilityAbiJson,
145
146 #[serde(rename = "payableInTokens")]
147 #[serde(default)]
148 #[serde(skip_serializing_if = "Vec::is_empty")]
149 pub payable_in_tokens: Vec<String>,
150
151 pub inputs: Vec<InputAbiJson>,
152
153 pub outputs: Vec<OutputAbiJson>,
154
155 #[serde(default)]
156 #[serde(skip_serializing_if = "Vec::is_empty")]
157 pub labels: Vec<String>,
158
159 #[serde(default)]
160 #[serde(skip_serializing_if = "Option::is_none")]
161 pub allow_multiple_var_args: Option<bool>,
162}
163
164impl From<&EndpointAbi> for EndpointAbiJson {
165 fn from(abi: &EndpointAbi) -> Self {
166 EndpointAbiJson {
167 docs: abi.docs.iter().map(|d| d.to_string()).collect(),
168 name: abi.name.to_string(),
169 title: abi.title.clone(),
170 only_owner: if abi.only_owner { Some(true) } else { None },
171 only_admin: if abi.only_admin { Some(true) } else { None },
172 mutability: match abi.mutability {
173 EndpointMutabilityAbi::Mutable => EndpointMutabilityAbiJson::Mutable,
174 EndpointMutabilityAbi::Readonly => EndpointMutabilityAbiJson::Readonly,
175 EndpointMutabilityAbi::Pure => EndpointMutabilityAbiJson::Pure,
176 },
177 payable_in_tokens: abi
178 .payable_in_tokens
179 .iter()
180 .map(|d| d.to_string())
181 .collect(),
182 inputs: abi.inputs.iter().map(InputAbiJson::from).collect(),
183 outputs: abi.outputs.iter().map(OutputAbiJson::from).collect(),
184 labels: abi.labels.clone(),
185 allow_multiple_var_args: if abi.allow_multiple_var_args {
186 Some(true)
187 } else {
188 None
189 },
190 }
191 }
192}
193
194impl From<&EndpointAbiJson> for EndpointAbi {
195 fn from(abi: &EndpointAbiJson) -> Self {
196 EndpointAbi {
197 docs: abi.docs.iter().map(|d| d.to_string()).collect(),
198 name: abi.name.to_string(),
199 only_owner: abi.only_owner.unwrap_or(false),
200 only_admin: abi.only_admin.unwrap_or(false),
201 mutability: match abi.mutability {
202 EndpointMutabilityAbiJson::Mutable => EndpointMutabilityAbi::Mutable,
203 EndpointMutabilityAbiJson::Readonly => EndpointMutabilityAbi::Readonly,
204 EndpointMutabilityAbiJson::Pure => EndpointMutabilityAbi::Pure,
205 },
206 payable_in_tokens: abi
207 .payable_in_tokens
208 .iter()
209 .map(|d| d.to_string())
210 .collect(),
211 inputs: abi.inputs.iter().map(InputAbi::from).collect(),
212 outputs: abi.outputs.iter().map(OutputAbi::from).collect(),
213 labels: abi.labels.clone(),
214 allow_multiple_var_args: abi.allow_multiple_var_args.unwrap_or(false),
215 rust_method_name: abi.name.clone(),
216 title: None,
217 endpoint_type: EndpointTypeAbi::Endpoint,
218 }
219 }
220}
221
222impl From<EndpointAbiJson> for EndpointAbi {
223 fn from(abi: EndpointAbiJson) -> Self {
224 EndpointAbi::from(&abi)
225 }
226}
227
228impl From<&ConstructorAbiJson> for EndpointAbi {
229 fn from(abi: &ConstructorAbiJson) -> Self {
230 EndpointAbi {
231 docs: abi.docs.iter().map(|d| d.to_string()).collect(),
232 name: "".to_string(),
233 only_owner: false,
234 only_admin: false,
235 mutability: EndpointMutabilityAbi::Mutable,
236 payable_in_tokens: abi
237 .payable_in_tokens
238 .iter()
239 .map(|d| d.to_string())
240 .collect(),
241 inputs: abi.inputs.iter().map(InputAbi::from).collect(),
242 outputs: abi.outputs.iter().map(OutputAbi::from).collect(),
243 labels: vec![],
244 allow_multiple_var_args: false,
245 rust_method_name: "".to_string(),
246 title: None,
247 endpoint_type: EndpointTypeAbi::Init,
248 }
249 }
250}
251
252impl From<ConstructorAbiJson> for EndpointAbi {
253 fn from(abi: ConstructorAbiJson) -> Self {
254 EndpointAbi::from(&abi)
255 }
256}