1use serde::{Deserialize, Serialize};
4use serde_json::Number;
5use std::collections::BTreeMap;
6
7#[derive(Debug, Deserialize, Serialize, Clone)]
9pub struct Blueprint {
10 pub preamble: Preamble,
11 pub validators: Vec<Validator>,
12 pub definitions: Option<Definitions>,
13}
14
15#[derive(Debug, Deserialize, Serialize, Clone)]
17#[serde(rename_all = "camelCase")]
18pub struct Preamble {
19 pub title: String,
20 pub description: Option<String>,
21 pub version: String,
22 pub plutus_version: String,
23 pub compiler: Option<Compiler>,
24 pub license: Option<String>,
25}
26
27#[derive(Debug, Deserialize, Serialize, Clone)]
29pub struct Compiler {
30 pub name: String,
31 pub version: Option<String>,
32}
33
34#[derive(Debug, Deserialize, Serialize, Clone)]
36#[serde(rename_all = "camelCase")]
37pub struct Validator {
38 pub title: String,
39 pub description: Option<String>,
40 pub compiled_code: Option<String>,
41 pub hash: Option<String>,
42 pub datum: Option<Argument>,
43 pub redeemer: Option<Argument>,
44 pub parameters: Option<Vec<Parameter>>,
45}
46
47#[derive(Debug, Deserialize, Serialize, Clone)]
49pub struct Argument {
50 pub title: Option<String>,
51 pub description: Option<String>,
52 pub purpose: Option<PurposeArray>,
53 pub schema: Reference,
54}
55
56#[derive(Debug, Deserialize, Serialize, Clone)]
58#[serde(untagged)]
59pub enum PurposeArray {
60 Single(Purpose),
61 Array(Vec<Purpose>),
62}
63
64#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq)]
66#[serde(rename_all = "camelCase")]
67pub enum Purpose {
68 Spend,
69 Mint,
70 Withdraw,
71 Publish,
72}
73
74#[derive(Debug, Deserialize, Serialize, Clone)]
76pub struct Reference {
77 #[serde(rename = "$ref")]
78 pub reference: Option<String>,
79}
80
81#[derive(Debug, Deserialize, Serialize, Clone)]
83pub struct Parameter {
84 pub title: Option<String>,
85 pub description: Option<String>,
86 pub purpose: Option<PurposeArray>,
87 pub schema: Reference,
88}
89
90#[derive(Debug, Default, Deserialize, Serialize, Clone)]
92pub struct Definitions {
93 #[serde(flatten, default)]
94 pub inner: BTreeMap<String, Definition>,
95}
96
97#[derive(Debug, Deserialize, Serialize, Clone)]
99#[serde(rename_all = "camelCase")]
100pub struct Definition {
101 #[serde(skip_serializing_if = "Option::is_none")]
102 pub title: Option<String>,
103 #[serde(skip_serializing_if = "Option::is_none")]
104 pub description: Option<String>,
105 #[serde(skip_serializing_if = "Option::is_none")]
106 pub data_type: Option<DataType>,
107 #[serde(skip_serializing_if = "Option::is_none")]
108 pub any_of: Option<Vec<Schema>>,
109 #[serde(skip_serializing_if = "Option::is_none")]
110 pub items: Option<ReferencesArray>,
111 #[serde(skip_serializing_if = "Option::is_none")]
112 pub keys: Option<Reference>,
113 #[serde(skip_serializing_if = "Option::is_none")]
114 pub values: Option<Reference>,
115}
116
117#[derive(Debug, Deserialize, Serialize, Clone)]
119#[serde(untagged)]
120pub enum ReferencesArray {
121 Single(Reference),
122 Array(Vec<Reference>),
123}
124
125#[derive(Debug, Deserialize, Serialize, Clone)]
127#[serde(rename_all = "camelCase")]
128pub struct Schema {
129 #[serde(skip_serializing_if = "Option::is_none")]
130 pub title: Option<String>,
131 #[serde(skip_serializing_if = "Option::is_none")]
132 pub description: Option<String>,
133 pub data_type: DataType,
134 pub index: Number,
135 pub fields: Vec<Field>,
136}
137
138#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq)]
140#[serde(rename_all = "camelCase")]
141pub enum DataType {
142 Integer,
143 Bytes,
144 List,
145 Map,
146 Constructor,
147}
148
149#[derive(Debug, Deserialize, Serialize, Clone)]
151pub struct Field {
152 #[serde(skip_serializing_if = "Option::is_none")]
153 pub title: Option<String>,
154 #[serde(rename = "$ref")]
155 pub reference: String,
156}