shank-parse-macro 2.0.0

Internal proc-macro implementation for shank-parse — generates Rust client code from Shank/Anchor IDL JSON files.
Documentation
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),
}

/// The variants carry distinct JSON keys (`option` / `defined` / `array`), so
/// serde's untagged matching is unambiguous regardless of declaration order.
#[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,
}