use libesedb::{EseDb, Table};
use std::ops::Index;
use crate::{ntds::NtdsAttributeId, ColumnInfoMapping, ColumnInformation};
pub struct EsedbInfo<'db> {
data_table: Table<'db>,
link_table: Table<'db>,
mapping: ColumnInfoMapping,
}
impl<'db> TryFrom<&'db EseDb> for EsedbInfo<'db> {
type Error = anyhow::Error;
fn try_from(esedb: &'db EseDb) -> Result<Self, Self::Error> {
let data_table = esedb.table_by_name("datatable")?;
let link_table = esedb.table_by_name("link_table")?;
let mapping = ColumnInfoMapping::try_from(&data_table)?;
Ok(Self {
data_table,
link_table,
mapping,
})
}
}
impl<'db> EsedbInfo<'db> {
pub fn mapping<'info>(&'info self) -> &'info ColumnInfoMapping
where
'info: 'db,
{
&self.mapping
}
pub fn data_table<'info>(&'info self) -> &Table<'db>
where
'info: 'db,
{
&self.data_table
}
pub fn link_table<'info>(&'info self) -> &Table<'db>
where
'info: 'db,
{
&self.link_table
}
pub fn column(&self, att_id: NtdsAttributeId) -> &ColumnInformation {
self.mapping().index(att_id)
}
}