telchar_codegen/
blueprint.rs

1//! This module defines the structures for a Blueprint, including its preamble, validators, and definitions.
2
3use serde::{Deserialize, Serialize};
4use serde_json::Number;
5use std::collections::BTreeMap;
6
7/// Represents a blueprint containing preamble, validators, and optional definitions.
8#[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/// Represents the preamble of a blueprint, including metadata such as title, description, version, and compiler information.
16#[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/// Represents the compiler information in the preamble.
28#[derive(Debug, Deserialize, Serialize, Clone)]
29pub struct Compiler {
30    pub name: String,
31    pub version: Option<String>,
32}
33
34/// Represents a validator in the blueprint, including its title, description, compiled code, hash, datum, redeemer, and parameters.
35#[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/// Represents an argument in a validator, including its title, description, purpose, and schema reference.
48#[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/// Represents a purpose array which can be either a single purpose or an array of purposes.
57#[derive(Debug, Deserialize, Serialize, Clone)]
58#[serde(untagged)]
59pub enum PurposeArray {
60    Single(Purpose),
61    Array(Vec<Purpose>),   
62}
63
64/// Represents the purpose of an argument, which can be spend, mint, withdraw, or publish.
65#[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/// Represents a reference to a schema.
75#[derive(Debug, Deserialize, Serialize, Clone)]
76pub struct Reference {
77    #[serde(rename = "$ref")]
78    pub reference: Option<String>,
79}
80
81/// Represents a parameter in a validator, including its title, description, purpose, and schema reference.
82#[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/// Represents the definitions in a blueprint, which is a map of definition names to their corresponding definitions.
91#[derive(Debug, Default, Deserialize, Serialize, Clone)]
92pub struct Definitions {
93    #[serde(flatten, default)]
94    pub inner: BTreeMap<String, Definition>,
95}
96
97/// Represents a definition in the blueprint, including its title, description, data type, any_of schemas, items, keys, and values.
98#[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/// Represents an array of references which can be either a single reference or an array of references.
118#[derive(Debug, Deserialize, Serialize, Clone)]
119#[serde(untagged)]
120pub enum ReferencesArray {
121    Single(Reference),
122    Array(Vec<Reference>),   
123}
124
125/// Represents a schema in a definition, including its title, description, data type, index, and fields.
126#[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/// Represents the data type of a schema, which can be integer, bytes, list, map, or constructor.
139#[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/// Represents a field in a schema, including its title and reference.
150#[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}