use tracing::{instrument, warn};
use crate::array::{Array, ArrayStringShort};
use crate::error::TableError;
use crate::table::Table;
use crate::traits::ArrayLike;
#[derive(Debug)]
pub struct Group {
tables_array: Array,
table_names: Vec<String>,
}
impl Group {
#[instrument(level = "debug")]
pub(crate) fn build(array: Array) -> crate::RealmResult<Self> {
let table_names = {
let array: ArrayStringShort = array.get_node(0)?.unwrap();
array.get_all()?
};
let tables_array = array.get_node(1)?.unwrap();
Ok(Self {
tables_array,
table_names,
})
}
}
impl Group {
#[instrument(level = "debug", skip(self), fields(table_names = ?self.table_names))]
pub fn get_table(&self, table_number: usize) -> crate::TableResult<Table> {
let table_array = self.tables_array.get_node(table_number)?.unwrap();
let table = Table::build(table_array, table_number)?;
Ok(table)
}
#[instrument(level = "debug", skip(self), fields(table_names = ?self.table_names))]
pub fn get_table_by_name(&self, name: &str) -> crate::TableResult<Table> {
let table_number = self
.table_names
.iter()
.position(|n| n == name)
.ok_or_else(|| TableError::TableNotFound {
name: name.to_string(),
})?;
self.get_table(table_number)
}
pub fn table_count(&self) -> usize {
self.table_names.len()
}
pub fn get_table_name(&self, index: usize) -> &str {
&self.table_names[index]
}
pub fn get_table_names(&self) -> &[String] {
&self.table_names
}
}