java_asm 0.1.3

Java bytecode reader & writer in rust
Documentation
use std::io::{BufWriter, Read, Write};

use crate::err::{AsmErr, AsmResult};
use crate::impls::jvms::r::{ReadContext, ReadFrom};

use crate::impls::jvms::r::transform::transform_class_file;
use crate::impls::jvms::w::WriteContext;
use crate::impls::ToArc;
use crate::jvms::element::ClassFile;

pub mod element;
pub mod attr;

pub struct JvmsClassReader;

impl JvmsClassReader {
    pub fn read_class_file<T: Read>(read: T) -> AsmResult<ClassFile> {
        let mut reader = read;
        let mut bytes = vec![];
        reader.read_to_end(&mut bytes)
            .map_err(|e| AsmErr::IOReadErr(e.arc()))?;
        Self::read_class_bytes(&bytes)
    }

    pub fn read_class_bytes(bytes: &[u8]) -> AsmResult<ClassFile> {
        let raw_file = ClassFile::read_from(&mut ReadContext::big_endian(bytes))?;
        let transformed = transform_class_file(raw_file)?;
        Ok(transformed)
    }
}


pub struct JvmsClassWriter;

impl JvmsClassWriter {
    pub fn write_class_file<T: Write>(write: T, class_file: ClassFile) -> AsmResult<()> {
        let mut writer = BufWriter::new(write);
        let bytes = Self::write_class_bytes(vec![], class_file)?;
        match writer.write(bytes.as_slice()) {
            Ok(_) => { Ok(()) }
            Err(e) => { Err(AsmErr::IOWriteErr(e.arc())) }
        }
    }

    pub fn write_class_bytes(bytes: Vec<u8>, class_file: ClassFile) -> AsmResult<Vec<u8>> {
        let mut write_context = WriteContext { bytes };
        write_context.write(class_file);
        Ok(write_context.bytes)
    }
}