use serde::Deserialize;
#[derive(Deserialize)]
pub struct Idl {
#[allow(dead_code)]
pub version: String,
pub name: String,
pub instructions: Vec<IdlInstruction>,
#[serde(default)]
pub accounts: Vec<IdlTypeDef>,
#[serde(default)]
pub types: Vec<IdlTypeDef>,
#[serde(default)]
pub errors: Vec<IdlError>,
#[serde(default)]
pub metadata: Option<IdlMetadata>,
}
#[derive(Deserialize)]
pub struct IdlInstruction {
pub name: String,
pub accounts: Vec<IdlAccountItem>,
pub args: Vec<IdlArg>,
pub discriminant: IdlDiscriminant,
}
#[derive(Deserialize)]
pub struct IdlAccountItem {
pub name: String,
#[serde(rename = "isMut")]
pub is_mut: bool,
#[serde(rename = "isSigner")]
pub is_signer: bool,
}
#[derive(Deserialize)]
pub struct IdlArg {
pub name: String,
#[serde(rename = "type")]
pub ty: IdlType,
}
#[derive(Deserialize, Clone)]
#[serde(untagged)]
pub enum IdlType {
Primitive(String),
Complex(IdlTypeComplex),
}
#[derive(Deserialize, Clone)]
#[serde(untagged)]
pub enum IdlTypeComplex {
Option { option: Box<IdlType> },
Defined { defined: String },
Array { array: (Box<IdlType>, usize) },
}
#[derive(Deserialize)]
pub struct IdlDiscriminant {
#[allow(dead_code)]
#[serde(rename = "type")]
pub ty: String,
pub value: u8,
}
#[derive(Deserialize)]
pub struct IdlTypeDef {
pub name: String,
#[serde(rename = "type")]
pub ty: IdlTypeDefTy,
}
#[derive(Deserialize)]
pub struct IdlTypeDefTy {
pub kind: String,
#[serde(default)]
pub fields: Vec<IdlField>,
#[serde(default)]
pub variants: Vec<IdlEnumVariant>,
}
#[derive(Deserialize, Clone)]
pub struct IdlField {
pub name: String,
#[serde(rename = "type")]
pub ty: IdlType,
}
#[derive(Deserialize)]
pub struct IdlEnumVariant {
pub name: String,
#[serde(default)]
pub fields: Vec<IdlEnumField>,
}
#[derive(Deserialize)]
pub struct IdlEnumField {
pub defined: String,
}
#[derive(Deserialize)]
pub struct IdlMetadata {
#[serde(default)]
pub address: Option<String>,
}
#[derive(Deserialize)]
pub struct IdlError {
pub code: u32,
pub name: String,
#[allow(dead_code)]
pub msg: String,
}