binwrite_derive 0.2.1

Derive macro for binwrite
Documentation
use super::attributes::AttrSetting;
use crate::binwrite_endian::Endian;
use proc_macro2::TokenStream;
use std::num::NonZeroUsize;

pub enum Action {
    Default,
    CutomerWriter(TokenStream),
}

#[derive(Default)]
pub struct GenOptions {
    pub pad_before: Option<NonZeroUsize>,
    pub pad_after: Option<NonZeroUsize>,
    pub align_before: Option<NonZeroUsize>,
    pub align_after: Option<NonZeroUsize>,
    pub preprocessor: Option<TokenStream>,
    pub postprocessor: Option<TokenStream>,
}

#[derive(Default)]
pub struct OptionalWriterOption {
    pub endian: Option<Endian>
}

pub struct WriteInstructions(pub Action, pub OptionalWriterOption, pub GenOptions);

impl WriteInstructions {
    pub fn try_from(settings: &[AttrSetting]) -> Option<WriteInstructions> {
        let mut action: Action = Action::Default;
        let mut writer_option = OptionalWriterOption::default();
        let mut gen_options = GenOptions::default();
        for setting in settings.iter() {
            match setting {
                AttrSetting::Endian(endian) => {
                    writer_option.endian = Some(*endian);
                }
                AttrSetting::With(writer_func) => {
                    action = Action::CutomerWriter(writer_func.clone());
                }
                AttrSetting::Preprocessor(preprocessor) => {
                    gen_options.preprocessor = Some(preprocessor.clone());
                }
                AttrSetting::Postprocessor(preprocessor) => {
                    gen_options.postprocessor = Some(preprocessor.clone());
                }
                AttrSetting::AlignBefore(pad) => {
                    gen_options.align_before = NonZeroUsize::new(*pad);
                }
                AttrSetting::AlignAfter(pad) => {
                    gen_options.align_after = NonZeroUsize::new(*pad);
                }
                AttrSetting::PadBefore(pad) => {
                    gen_options.pad_before = NonZeroUsize::new(*pad);
                }
                AttrSetting::PadAfter(pad) => {
                    gen_options.pad_after = NonZeroUsize::new(*pad);
                }
                AttrSetting::Ignore => {
                    None?
                }
            }
        }
        
        Some(WriteInstructions(action, writer_option, gen_options))
    }
}