1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
use serde::{Deserialize, Serialize};

#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ABIType {
    pub name: String,
    #[serde(rename = "type")]
    pub ty: String,
}

#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ABIStruct {
    pub name: String,
    pub base: String,
    pub fields: Vec<ABIType>,
}

#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ABIAction {
    pub name: String,
    #[serde(rename = "type")]
    pub ty: String,
    #[serde(default)]
    pub ricardian_contract: String,
}

#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ABITable {
    name: String,
    #[serde(rename = "type")]
    ty: String,
    index_type: String,
    #[serde(default)]
    key_names: Vec<String>,
    #[serde(default)]
    key_types: Vec<String>,
}

#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ABIVariant {
    name: String,
    // #[serde(deserialize_with = "string_or_seq_string")]
    types: Vec<String>,
}

#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ABITypes {
    new_type_name: String,
    #[serde(rename = "type")]
    ty: String,
}

#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ABIRicardianClause {
    id: String,
    body: String,
}

#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ABIActionResult {
    name: String,
    result_type: String,
}

#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ABIErrorMessage {
    error_code: u64,
    error_msg: String,
}

#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct WrappedABI {
    pub account_name: String,
    pub abi: ABI,
}

impl TryFrom<&str> for WrappedABI {
    type Error = serde_json::Error;
    #[inline]
    fn try_from(str: &str) -> Result<Self, Self::Error> {
        serde_json::from_str(str)
    }
}

#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ABI {
    pub version: String,
    #[serde(default)]
    pub types: Vec<ABITypes>,
    #[serde(default)]
    pub structs: Vec<ABIStruct>,
    #[serde(default)]
    pub actions: Vec<ABIAction>,
    #[serde(default)]
    pub tables: Vec<ABITable>,
    #[serde(default)]
    pub variants: Vec<ABIVariant>,
    #[serde(default)]
    pub abi_extensions: Vec<String>,
    #[serde(default)]
    pub error_messages: Vec<ABIErrorMessage>,
    #[serde(default)]
    pub ricardian_clauses: Vec<ABIRicardianClause>,
    #[serde(default)]
    pub action_results: Vec<ABIActionResult>,
}

impl TryFrom<&str> for ABI {
    type Error = serde_json::Error;
    #[inline]
    fn try_from(str: &str) -> Result<Self, Self::Error> {
        serde_json::from_str(str)
    }
}