use serde::{Deserialize, Serialize};
pub type Path = Vec<String>;
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct Program {
pub program: String,
pub implements: Vec<InterfaceRef>,
pub structs: Vec<Struct>,
pub records: Vec<Record>,
pub mappings: Vec<Mapping>,
pub storage_variables: Vec<StorageVariable>,
pub functions: Vec<Function>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub views: Vec<Function>,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct Interface {
pub name: String,
pub program: String,
pub path: Path,
pub parents: Vec<InterfaceRef>,
pub functions: Vec<Function>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub views: Vec<Function>,
pub records: Vec<Record>,
pub mappings: Vec<Mapping>,
pub storage_variables: Vec<StorageVariable>,
pub structs: Vec<Struct>,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct InterfaceRef {
pub program: Option<String>,
pub path: Path,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct ConstParameter {
pub name: String,
pub ty: Plaintext,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct Struct {
pub path: Path,
pub fields: Vec<StructField>,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct Record {
pub path: Path,
pub fields: Vec<RecordField>,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct Mapping {
pub name: String,
pub key: Plaintext,
pub value: Plaintext,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct StorageVariable {
pub name: String,
pub ty: StorageType,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub enum StorageType {
Plaintext(Plaintext),
Vector(Box<StorageType>),
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct Function {
pub name: String,
pub is_final: bool,
pub const_parameters: Vec<ConstParameter>,
pub inputs: Vec<Input>,
pub outputs: Vec<Output>,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct StructField {
pub name: String,
pub ty: Plaintext,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct RecordField {
pub name: String,
pub ty: Plaintext,
pub mode: Mode,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct Input {
pub name: String,
pub ty: FunctionInput,
pub mode: Mode,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct Output {
pub ty: FunctionOutput,
pub mode: Mode,
}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Serialize, Deserialize)]
pub enum Mode {
None,
Constant,
Private,
Public,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct Array {
pub element: Box<Plaintext>,
pub length: u32,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct StructRef {
pub path: Path,
pub program: Option<String>,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct RecordRef {
pub path: Path,
pub program: Option<String>,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct Optional(pub Box<Plaintext>);
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub enum Plaintext {
Primitive(Primitive),
Array(Array),
Struct(StructRef),
Optional(Optional),
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub enum FunctionInput {
Plaintext(Plaintext),
Record(RecordRef),
DynamicRecord,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub enum FunctionOutput {
Plaintext(Plaintext),
Record(RecordRef),
Final,
DynamicRecord,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub enum Primitive {
Address,
Boolean,
Field,
Group,
Identifier,
Scalar,
Signature,
Int(Int),
UInt(UInt),
}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Serialize, Deserialize)]
pub enum Int {
I8,
I16,
I32,
I64,
I128,
}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Serialize, Deserialize)]
pub enum UInt {
U8,
U16,
U32,
U64,
U128,
}