java_asm 0.1.3

Java bytecode reader & writer in rust
Documentation
pub struct OnceAsmVec<T> {
    tag: &'static str,
    vec: OnceCell<Vec<T>>,
}

impl<T> OnceAsmVec<T> {
    pub fn new(tag: &'static str) -> Self {
        Self { tag, vec: OnceCell::new() }
    }

    pub fn to_vec(self) -> Vec<T> {
        self.vec.into_inner().unwrap_or_default()
    }
}

impl<T: Debug> OnceAsmVec<T> {
    pub fn put(&self, vec: Vec<T>) -> AsmResult<()> {
        self.vec.set(vec).map_err(|origin| {
            let err_msg = format!("{} already initialized with {:?}", self.tag, origin);
            AsmErr::IllegalFormat(err_msg)
        })
    }
}

macro_rules! once_vec_builder {
    {
        $(let $name:ident: $vecType:ty;)*
    } => {
        $(
            let $name = OnceAsmVec::<$vecType>::new(stringify!($name));
        )*
    };
}

macro_rules! once_vec_unpack {
    { $($name:ident),* } => {
        $(
            let $name = $name.to_vec();
        )*
    };
}

use std::cell::OnceCell;
use std::fmt::Debug;
pub(crate) use once_vec_builder;
pub(crate) use once_vec_unpack;
use crate::{AsmErr, AsmResult};