multiversx_sc_meta_lib/abi_json/
endpoint_abi_json.rs

1use 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    /// Bool that is only serialized when true
13    #[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    /// Bool that is only serialized when true
37    #[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/// Same as EndpointAbiJson but ignores the name
61#[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}