use crate::{
metadata::{
signatures::{parse_field_signature, SignatureField, TypeSignature},
streams::{Blob, Strings},
tables::{LocalConstant, LocalConstantRc, TableInfoRef, TableRow},
token::Token,
},
Result,
};
use std::sync::Arc;
#[derive(Debug, Clone)]
pub struct LocalConstantRaw {
pub rid: u32,
pub token: Token,
pub offset: usize,
pub name: u32,
pub signature: u32,
}
impl LocalConstantRaw {
pub fn to_owned(&self, strings: &Strings, blobs: &Blob) -> Result<LocalConstantRc> {
let name = if self.name == 0 {
String::new()
} else {
strings.get(self.name as usize)?.to_string()
};
let signature = if self.signature == 0 {
SignatureField {
modifiers: Vec::new(),
base: TypeSignature::Void,
}
} else {
let signature_blob = blobs.get(self.signature as usize)?;
parse_field_signature(signature_blob)?
};
let constant = LocalConstant {
rid: self.rid,
token: self.token,
offset: self.offset,
name,
signature,
};
Ok(Arc::new(constant))
}
}
impl TableRow for LocalConstantRaw {
#[rustfmt::skip]
fn row_size(sizes: &TableInfoRef) -> u32 {
u32::from(
sizes.str_bytes() +
sizes.blob_bytes()
)
}
}