use std::sync::{Arc, OnceLock};
use crate::{
metadata::{
signatures::parse_field_signature,
streams::{Blob, Strings},
tables::{Field, FieldAttributes, FieldRc, TableInfoRef, TableRow},
token::Token,
},
Result,
};
#[derive(Clone, Debug)]
pub struct FieldRaw {
pub rid: u32,
pub token: Token,
pub offset: usize,
pub flags: u32,
pub name: u32,
pub signature: u32,
}
impl FieldRaw {
pub fn to_owned(&self, blob: &Blob, strings: &Strings) -> Result<FieldRc> {
Ok(Arc::new(Field {
rid: self.rid,
token: self.token,
offset: self.offset,
flags: FieldAttributes::new(self.flags),
name: strings.get(self.name as usize)?.to_string(),
signature: parse_field_signature(blob.get(self.signature as usize)?)?,
default: OnceLock::new(),
rva: OnceLock::new(),
layout: OnceLock::new(),
marshal: OnceLock::new(),
custom_attributes: Arc::new(boxcar::Vec::new()),
declaring_type: OnceLock::new(),
}))
}
pub fn apply(&self) -> Result<()> {
Ok(())
}
}
impl TableRow for FieldRaw {
#[rustfmt::skip]
fn row_size(sizes: &TableInfoRef) -> u32 {
u32::from(
2u8
.saturating_add(sizes.str_bytes())
.saturating_add(sizes.blob_bytes())
)
}
}