1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4#[derive(Clone, Debug, Serialize, Deserialize)]
5#[serde(rename_all = "lowercase")]
6pub enum PlutusVersion {
7 V1,
8 V2,
9 V3,
10}
11
12#[derive(Clone, Debug, Serialize, Deserialize)]
13pub struct Compiler {
14 pub name: String,
15 pub version: String,
16}
17
18#[derive(Clone, Debug, Serialize, Deserialize)]
19pub struct Preamble {
20 pub title: String,
21 pub description: String,
22 pub version: String,
23 #[serde(rename = "plutusVersion")]
24 pub plutus_version: PlutusVersion,
25 pub compiler: Compiler,
26 pub license: String,
27}
28
29#[derive(Clone, Debug, Serialize, Deserialize)]
30pub struct Reference {
31 #[serde(rename = "$ref")]
32 pub reference: String,
33}
34
35#[derive(Clone, Debug, Serialize, Deserialize)]
36pub struct ByteDefinition {
37 pub title: String,
38 #[serde(rename = "dataType")]
39 pub data_type: String, }
41
42#[derive(Clone, Debug, Serialize, Deserialize)]
43pub struct DataDefinition {
44 pub title: String, pub description: String,
46}
47
48#[derive(Clone, Debug, Serialize, Deserialize)]
49pub struct ConstructorField {
50 pub title: String,
51 #[serde(rename = "dataType")]
52 pub data_type: String,
53 pub index: u32,
54 pub fields: Vec<serde_json::Value>,
55}
56
57#[derive(Clone, Debug, Serialize, Deserialize)]
58pub struct BoolDefinition {
59 pub title: String, #[serde(rename = "anyOf")]
61 pub any_of: [ConstructorField; 2], }
63
64#[derive(Clone, Debug, Serialize, Deserialize)]
65pub struct IntDefinition {
66 #[serde(rename = "dataType")]
67 pub data_type: String, }
69
70#[derive(Clone, Debug, Serialize, Deserialize)]
71pub struct MapDefinition {
72 pub title: String,
73 #[serde(rename = "dataType")]
74 pub data_type: String, pub keys: Reference,
76 pub values: Reference,
77}
78
79#[derive(Clone, Debug, Serialize, Deserialize)]
80pub struct ListDefinition {
81 pub title: String,
82 #[serde(rename = "dataType")]
83 pub data_type: String, pub items: Reference,
85}
86
87#[derive(Clone, Debug, Serialize, Deserialize)]
88pub struct TupleDefinition {
89 pub title: String,
90 #[serde(rename = "dataType")]
91 pub data_type: String, pub items: Vec<Reference>,
93}
94
95#[derive(Clone, Debug, Serialize, Deserialize)]
96pub struct SomeConstructor {
97 pub title: String, pub description: String,
99 #[serde(rename = "dataType")]
100 pub data_type: String, pub index: u32, pub fields: Vec<Reference>,
103}
104
105#[derive(Clone, Debug, Serialize, Deserialize)]
106pub struct NoneConstructor {
107 pub title: String, pub description: String,
109 #[serde(rename = "dataType")]
110 pub data_type: String, pub index: u32, pub fields: Vec<serde_json::Value>, }
114
115#[derive(Clone, Debug, Serialize, Deserialize)]
116pub struct OptionDefinition {
117 pub title: String, #[serde(rename = "anyOf")]
119 pub any_of: [serde_json::Value; 2], }
121
122#[derive(Clone, Debug, Serialize, Deserialize)]
123pub struct ConstructorDefinition {
124 pub title: String,
125 #[serde(rename = "dataType")]
126 pub data_type: String, pub index: u32,
128 pub fields: Vec<Reference>,
129}
130
131#[derive(Clone, Debug, Serialize, Deserialize)]
132pub struct ConstructorsDefinition {
133 pub title: String,
134 #[serde(skip_serializing_if = "Option::is_none")]
135 pub description: Option<String>,
136 #[serde(rename = "anyOf")]
137 pub any_of: Vec<ConstructorDefinition>,
138}
139
140pub type IgnoreDefinition = DataDefinition;
141
142#[derive(Clone, Debug, Serialize, Deserialize)]
143#[serde(untagged)]
144pub enum CustomDefinition {
145 Map(MapDefinition),
146 List(ListDefinition),
147 Tuple(TupleDefinition),
148 Option(OptionDefinition),
149 Constructors(ConstructorsDefinition),
150}
151
152#[derive(Clone, Debug, Serialize, Deserialize)]
153#[serde(untagged)]
154pub enum PrimitiveDefinition {
155 Int(IntDefinition),
156 Byte(ByteDefinition),
157 Bool(BoolDefinition),
158}
159
160#[derive(Clone, Debug, Serialize, Deserialize)]
161#[serde(untagged)]
162pub enum Items {
163 Single(Reference),
164 Multiple(Vec<Reference>),
165}
166
167#[derive(Clone, Debug, Serialize, Deserialize)]
168#[serde(untagged)]
169pub enum AnyOf {
170 Constructors(Vec<ConstructorDefinition>),
171 Option([serde_json::Value; 2]), Bool([serde_json::Value; 2]), }
174
175#[derive(Clone, Debug, Serialize, Deserialize)]
176pub struct Definition {
177 #[serde(skip_serializing_if = "Option::is_none")]
178 pub title: Option<String>,
179 #[serde(rename = "dataType", skip_serializing_if = "Option::is_none")]
180 pub data_type: Option<String>,
181 #[serde(skip_serializing_if = "Option::is_none")]
182 pub description: Option<String>,
183 #[serde(skip_serializing_if = "Option::is_none")]
184 pub index: Option<u32>,
185 #[serde(rename = "anyOf", skip_serializing_if = "Option::is_none")]
186 pub any_of: Option<AnyOf>,
187 #[serde(skip_serializing_if = "Option::is_none")]
188 pub keys: Option<Reference>,
189 #[serde(skip_serializing_if = "Option::is_none")]
190 pub values: Option<Reference>,
191 #[serde(skip_serializing_if = "Option::is_none")]
192 pub items: Option<Items>,
193 #[serde(skip_serializing_if = "Option::is_none")]
194 pub fields: Option<Vec<Reference>>,
195}
196
197pub type Definitions = HashMap<String, Definition>;
198
199#[derive(Clone, Debug, Serialize, Deserialize)]
200pub struct Schema {
201 #[serde(rename = "$ref", skip_serializing_if = "Option::is_none")]
202 pub reference: Option<String>,
203}
204
205#[derive(Clone, Debug, Serialize, Deserialize)]
206pub struct Parameter {
207 pub title: String,
208 pub schema: Reference,
209}
210
211#[derive(Clone, Debug, Serialize, Deserialize)]
212pub struct Redeemer {
213 #[serde(skip_serializing_if = "Option::is_none")]
214 pub title: Option<String>,
215 pub schema: Schema,
216}
217
218#[derive(Clone, Debug, Serialize, Deserialize)]
219pub struct Datum {
220 pub title: String,
221 pub schema: Reference,
222}
223
224#[derive(Clone, Debug, Serialize, Deserialize)]
225pub struct Validator {
226 pub title: String,
227 #[serde(skip_serializing_if = "Option::is_none")]
228 pub redeemer: Option<Redeemer>,
229 #[serde(skip_serializing_if = "Option::is_none")]
230 pub parameters: Option<Vec<Parameter>>,
231 #[serde(skip_serializing_if = "Option::is_none")]
232 pub datum: Option<Datum>,
233 #[serde(rename = "compiledCode")]
234 pub compiled_code: String,
235 pub hash: String,
236}
237
238#[derive(Clone, Debug, Serialize, Deserialize)]
239#[serde(rename_all = "lowercase")]
240pub enum ScriptPurpose {
241 Spend,
242 Mint,
243 Withdraw,
244 Publish,
245}
246
247#[derive(Clone, Debug, Serialize, Deserialize)]
249pub struct Blueprint {
250 pub preamble: Preamble,
251 pub validators: Vec<Validator>,
252 pub definitions: Definitions,
253}