lvm-class 0.1.0

JVM class file parser and writer for the Lagertha VM project
Documentation
use crate::constant_pool::{ConstantEntry, ConstantPool};
use common::error::ClassFormatErr;
use common::utils::indent_write::Indented;
use std::fmt::Write as _;

impl ConstantPool {
    pub(super) fn get_raw_entry(&self, idx: u16) -> Result<&ConstantEntry, ClassFormatErr> {
        self.inner
            .get(idx as usize)
            .ok_or(ClassFormatErr::ConstantNotFound(idx))
    }
}

impl ConstantEntry {
    pub(super) fn fmt_rns(
        &self,
        ind: &mut Indented,
        cp: &ConstantPool,
    ) -> Result<(), ClassFormatErr> {
        match self {
            ConstantEntry::Utf8(s) => write!(ind, "{}", s)?,
            ConstantEntry::Class(class_idx) => cp.get_raw_entry(*class_idx)?.fmt_rns(ind, cp)?,
            ConstantEntry::NameAndType(name_and_type_idx) => {
                cp.get_raw_entry(name_and_type_idx.name_index)?
                    .fmt_rns(ind, cp)?;
                write!(ind, " ")?;
                cp.get_raw_entry(name_and_type_idx.descriptor_index)?
                    .fmt_rns(ind, cp)?;
            }
            ConstantEntry::MethodRef(method_ref) => {
                cp.get_raw_entry(method_ref.class_index)?.fmt_rns(ind, cp)?;
                write!(ind, " ")?;
                cp.get_raw_entry(method_ref.name_and_type_index)?
                    .fmt_rns(ind, cp)?;
            }
            ConstantEntry::FieldRef(field_ref) => {
                cp.get_raw_entry(field_ref.class_index)?.fmt_rns(ind, cp)?;
                write!(ind, " ")?;
                cp.get_raw_entry(field_ref.name_and_type_index)?
                    .fmt_rns(ind, cp)?;
            }
            ConstantEntry::String(idx) => {
                write!(ind, "\"")?;
                cp.get_raw_entry(*idx)?.fmt_rns(ind, cp)?;
                write!(ind, "\"")?;
            }
            un => unimplemented!("{:?} is not supported for writing right now", un),
        };
        Ok(())
    }
}