ircv3_parse_derive 4.0.0

Derive macro for ircv3_parse
Documentation
mod enums;
mod field;
mod field_kind;
mod unit;

use proc_macro2::TokenStream;
use syn::{DeriveInput, Result};

use crate::ast::{Input, Struct};

pub fn derive_from_message(node: &DeriveInput) -> Result<TokenStream> {
    let input = Input::from_syn(node, "FromMessage")?;
    input.validate()?;

    match input {
        Input::Struct(input) => Ok(input.expand_de()),
        Input::Enum(input) => Ok(input.expand_de()),
    }
}

pub fn derive_to_message(node: &DeriveInput) -> Result<TokenStream> {
    let input = Input::from_syn(node, "ToMessage")?;

    input.validate()?;
    input.validate_ser()?;

    match input {
        Input::Struct(input) => Ok(input.expand_ser()),
        Input::Enum(input) => Ok(input.expand_ser()),
    }
}

impl<'a> Struct<'a> {
    pub fn expand_de(&self) -> TokenStream {
        match self {
            Struct::Unit(input) => input.expand_de(),
            Struct::Fields(input) => input.expand_de(),
        }
    }

    pub fn expand_ser(&self) -> TokenStream {
        match self {
            Struct::Unit(input) => input.expand_ser(),
            Struct::Fields(input) => input.expand_ser(),
        }
    }
}