use rayon::iter::{IndexedParallelIterator, ParallelIterator};
use crate::{
metadata::{
diagnostics::DiagnosticCategory,
loader::{LoaderContext, MetadataLoader},
tables::ManifestResourceRaw,
},
prelude::TableId,
Result,
};
pub(crate) struct ManifestResourceLoader;
impl MetadataLoader for ManifestResourceLoader {
fn load(&self, context: &LoaderContext) -> Result<()> {
let (Some(header), Some(strings)) = (context.meta, context.strings) else {
return Ok(());
};
let Some(table) = header.table::<ManifestResourceRaw>() else {
return Ok(());
};
table.par_iter().enumerate().try_for_each(|(index, row)| {
let Some(row) = context.handle_row(row, index)? else {
return Ok(());
};
let token_msg = || format!("manifest resource 0x{:08x}", row.token.value());
let Some(owned) = context.handle_result(
row.to_owned(
|coded_index| context.get_ref(coded_index),
&context.input,
context.header,
strings,
table,
),
DiagnosticCategory::Table,
token_msg,
)?
else {
return Ok(());
};
context.resources.insert(owned.clone());
Ok(())
})
}
fn table_id(&self) -> Option<TableId> {
Some(TableId::ManifestResource)
}
fn dependencies(&self) -> &'static [TableId] {
&[TableId::File, TableId::AssemblyRef]
}
}