Skip to main content

whisky_common/data/
blueprint.rs

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, // "bytes"
40}
41
42#[derive(Clone, Debug, Serialize, Deserialize)]
43pub struct DataDefinition {
44    pub title: String, // "Data"
45    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, // "Bool"
60    #[serde(rename = "anyOf")]
61    pub any_of: [ConstructorField; 2], // False and True
62}
63
64#[derive(Clone, Debug, Serialize, Deserialize)]
65pub struct IntDefinition {
66    #[serde(rename = "dataType")]
67    pub data_type: String, // "integer"
68}
69
70#[derive(Clone, Debug, Serialize, Deserialize)]
71pub struct MapDefinition {
72    pub title: String,
73    #[serde(rename = "dataType")]
74    pub data_type: String, // "map"
75    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, // "list"
84    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, // "list"
92    pub items: Vec<Reference>,
93}
94
95#[derive(Clone, Debug, Serialize, Deserialize)]
96pub struct SomeConstructor {
97    pub title: String, // "Some"
98    pub description: String,
99    #[serde(rename = "dataType")]
100    pub data_type: String, // "constructor"
101    pub index: u32, // 0
102    pub fields: Vec<Reference>,
103}
104
105#[derive(Clone, Debug, Serialize, Deserialize)]
106pub struct NoneConstructor {
107    pub title: String, // "None"
108    pub description: String,
109    #[serde(rename = "dataType")]
110    pub data_type: String, // "constructor"
111    pub index: u32,                     // 1
112    pub fields: Vec<serde_json::Value>, // empty
113}
114
115#[derive(Clone, Debug, Serialize, Deserialize)]
116pub struct OptionDefinition {
117    pub title: String, // "Option"
118    #[serde(rename = "anyOf")]
119    pub any_of: [serde_json::Value; 2], // Some and None
120}
121
122#[derive(Clone, Debug, Serialize, Deserialize)]
123pub struct ConstructorDefinition {
124    pub title: String,
125    #[serde(rename = "dataType")]
126    pub data_type: String, // "constructor"
127    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]), // Some and None
172    Bool([serde_json::Value; 2]),   // False and True
173}
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/// Main Blueprint structure containing preamble, validators, and definitions
248#[derive(Clone, Debug, Serialize, Deserialize)]
249pub struct Blueprint {
250    pub preamble: Preamble,
251    pub validators: Vec<Validator>,
252    pub definitions: Definitions,
253}