use std::sync::Arc;
use crate::{
metadata::{
streams::{Guid, Strings},
tables::{Module, ModuleRc, TableInfoRef, TableRow},
token::Token,
},
Result,
};
#[derive(Clone, Debug)]
pub struct ModuleRaw {
pub rid: u32,
pub token: Token,
pub offset: usize,
pub generation: u32,
pub name: u32,
pub mvid: u32,
pub encid: u32,
pub encbaseid: u32,
}
impl ModuleRaw {
pub fn to_owned(&self, strings: &Strings, guids: &Guid) -> Result<ModuleRc> {
Ok(Arc::new(Module {
rid: self.rid,
token: self.token,
offset: self.offset,
generation: self.generation,
name: strings.get(self.name as usize)?.to_string(),
mvid: guids.get(self.mvid as usize)?,
encid: if self.encid == 0 {
None
} else {
Some(guids.get(self.encid as usize)?)
},
encbaseid: if self.encbaseid == 0 {
None
} else {
Some(guids.get(self.encbaseid as usize)?)
},
imports: Vec::new(),
custom_attributes: Arc::new(boxcar::Vec::new()),
}))
}
pub fn apply(&self) -> Result<()> {
Ok(())
}
}
impl TableRow for ModuleRaw {
#[rustfmt::skip]
fn row_size(sizes: &TableInfoRef) -> u32 {
u32::from(
2 +
sizes.str_bytes() +
sizes.guid_bytes() +
sizes.guid_bytes() +
sizes.guid_bytes()
)
}
}