cfsp 1.0.1

A JVM Bytecode Manipulation Framework inspired by ASM.
Documentation
use serde::{Deserialize, Serialize};

use crate::node::access_flag::{ExportsAccessFlag, OpensAccessFlag, RequiresAccessFlag};
use crate::node::constant::{ConstantPool, Module, Package, Utf8};

#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub struct Requires {
    pub requires_index: u16,
    pub requires_flags: RequiresAccessFlag,
    pub requires_version_index: u16,
}

impl Requires {
    pub fn requires<'attribute, 'constant_pool: 'attribute>(
        &'attribute self,
        constant_pool: &'constant_pool ConstantPool,
    ) -> Option<&'constant_pool Module> {
        constant_pool.get_module(self.requires_index)
    }

    pub fn requires_version<'attribute, 'constant_pool: 'attribute>(
        &'attribute self,
        constant_pool: &'constant_pool ConstantPool,
    ) -> Option<&'constant_pool Utf8> {
        constant_pool.get_utf8(self.requires_version_index)
    }
}

#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub struct Exports {
    pub exports_index: u16,
    pub exports_flags: ExportsAccessFlag,
    pub exports_to_count: u16,
    pub exports_to_index: Vec<u16>,
}

impl Exports {
    pub fn exports<'attribute, 'constant_pool: 'attribute>(
        &'attribute self,
        constant_pool: &'constant_pool ConstantPool,
    ) -> Option<&'constant_pool Package> {
        constant_pool.get_package(self.exports_index)
    }

    pub fn exports_to<'attribute, 'constant_pool: 'attribute>(
        &'attribute self,
        index: usize,
        constant_pool: &'constant_pool ConstantPool,
    ) -> Option<&'constant_pool Module> {
        self.exports_to_index
            .get(index)
            .and_then(|exports_to_index| constant_pool.get_module(*exports_to_index))
    }
}

#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub struct Opens {
    pub opens_index: u16,
    pub opens_flags: OpensAccessFlag,
    pub opens_to_count: u16,
    pub opens_to_index: Vec<u16>,
}

impl Opens {
    pub fn opens<'attribute, 'constant_pool: 'attribute>(
        &'attribute self,
        constant_pool: &'constant_pool ConstantPool,
    ) -> Option<&'constant_pool Package> {
        constant_pool.get_package(self.opens_index)
    }

    pub fn opens_to<'attribute, 'constant_pool: 'attribute>(
        &'attribute self,
        index: usize,
        constant_pool: &'constant_pool ConstantPool,
    ) -> Option<&'constant_pool Module> {
        self.opens_to_index
            .get(index)
            .and_then(|opens_to_index| constant_pool.get_module(*opens_to_index))
    }
}

#[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub struct Provides {
    pub provides_index: u16,
    pub provides_with_count: u16,
    pub provides_with_index: Vec<u16>,
}

impl Provides {
    pub fn provides<'attribute, 'constant_pool: 'attribute>(
        &'attribute self,
        constant_pool: &'constant_pool ConstantPool,
    ) -> Option<&'constant_pool Package> {
        constant_pool.get_package(self.provides_index)
    }

    pub fn provides_to<'attribute, 'constant_pool: 'attribute>(
        &'attribute self,
        index: usize,
        constant_pool: &'constant_pool ConstantPool,
    ) -> Option<&'constant_pool Module> {
        self.provides_with_index
            .get(index)
            .and_then(|provides_with_index| constant_pool.get_module(*provides_with_index))
    }
}