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
28#[derive(Serialize, Deserialize)]
29pub struct OutputAbiJson {
30 #[serde(rename = "name")]
31 #[serde(default)]
32 #[serde(skip_serializing_if = "String::is_empty")]
33 pub output_name: String,
34 #[serde(rename = "type")]
35 pub type_name: String,
36 #[serde(default)]
38 #[serde(skip_serializing_if = "Option::is_none")]
39 pub multi_result: Option<bool>,
40}
41
42impl From<&OutputAbi> for OutputAbiJson {
43 fn from(abi: &OutputAbi) -> Self {
44 OutputAbiJson {
45 output_name: abi.output_name.clone(),
46 type_name: abi.type_names.abi.clone(),
47 multi_result: if abi.multi_result { Some(true) } else { None },
48 }
49 }
50}
51
52#[derive(Serialize, Deserialize)]
53#[serde(rename_all = "camelCase")]
54pub enum EndpointMutabilityAbiJson {
55 Mutable,
56 Readonly,
57 Pure,
58}
59
60#[derive(Serialize, Deserialize)]
62pub struct ConstructorAbiJson {
63 #[serde(default)]
64 #[serde(skip_serializing_if = "Vec::is_empty")]
65 pub docs: Vec<String>,
66 #[serde(rename = "payableInTokens")]
67 #[serde(default)]
68 #[serde(skip_serializing_if = "Vec::is_empty")]
69 pub payable_in_tokens: Vec<String>,
70 pub inputs: Vec<InputAbiJson>,
71 pub outputs: Vec<OutputAbiJson>,
72}
73
74impl From<&EndpointAbi> for ConstructorAbiJson {
75 fn from(abi: &EndpointAbi) -> Self {
76 ConstructorAbiJson {
77 docs: abi.docs.iter().map(|d| d.to_string()).collect(),
78 payable_in_tokens: abi
79 .payable_in_tokens
80 .iter()
81 .map(|d| d.to_string())
82 .collect(),
83 inputs: abi.inputs.iter().map(InputAbiJson::from).collect(),
84 outputs: abi.outputs.iter().map(OutputAbiJson::from).collect(),
85 }
86 }
87}
88
89#[derive(Serialize, Deserialize)]
90pub struct EndpointAbiJson {
91 #[serde(default)]
92 #[serde(skip_serializing_if = "Vec::is_empty")]
93 pub docs: Vec<String>,
94 pub name: String,
95
96 #[serde(default)]
97 #[serde(skip_serializing_if = "Option::is_none")]
98 pub title: Option<String>,
99
100 #[serde(rename = "onlyOwner")]
101 #[serde(default)]
102 #[serde(skip_serializing_if = "Option::is_none")]
103 pub only_owner: Option<bool>,
104
105 #[serde(rename = "onlyAdmin")]
106 #[serde(default)]
107 #[serde(skip_serializing_if = "Option::is_none")]
108 pub only_admin: Option<bool>,
109
110 pub mutability: EndpointMutabilityAbiJson,
111
112 #[serde(rename = "payableInTokens")]
113 #[serde(default)]
114 #[serde(skip_serializing_if = "Vec::is_empty")]
115 pub payable_in_tokens: Vec<String>,
116
117 pub inputs: Vec<InputAbiJson>,
118
119 pub outputs: Vec<OutputAbiJson>,
120
121 #[serde(default)]
122 #[serde(skip_serializing_if = "Vec::is_empty")]
123 pub labels: Vec<String>,
124
125 #[serde(default)]
126 #[serde(skip_serializing_if = "Option::is_none")]
127 pub allow_multiple_var_args: Option<bool>,
128}
129
130impl From<&EndpointAbi> for EndpointAbiJson {
131 fn from(abi: &EndpointAbi) -> Self {
132 EndpointAbiJson {
133 docs: abi.docs.iter().map(|d| d.to_string()).collect(),
134 name: abi.name.to_string(),
135 title: abi.title.clone(),
136 only_owner: if abi.only_owner { Some(true) } else { None },
137 only_admin: if abi.only_admin { Some(true) } else { None },
138 mutability: match abi.mutability {
139 EndpointMutabilityAbi::Mutable => EndpointMutabilityAbiJson::Mutable,
140 EndpointMutabilityAbi::Readonly => EndpointMutabilityAbiJson::Readonly,
141 EndpointMutabilityAbi::Pure => EndpointMutabilityAbiJson::Pure,
142 },
143 payable_in_tokens: abi
144 .payable_in_tokens
145 .iter()
146 .map(|d| d.to_string())
147 .collect(),
148 inputs: abi.inputs.iter().map(InputAbiJson::from).collect(),
149 outputs: abi.outputs.iter().map(OutputAbiJson::from).collect(),
150 labels: abi.labels.clone(),
151 allow_multiple_var_args: if abi.allow_multiple_var_args {
152 Some(true)
153 } else {
154 None
155 },
156 }
157 }
158}