use indexmap::IndexMap;
mod object;
pub use object::*;
mod read;
mod write;
#[cfg(test)]
mod tests;
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub struct BinTree {
pub is_override: bool,
pub version: u32,
pub objects: IndexMap<u32, BinTreeObject>,
pub dependencies: Vec<String>,
data_overrides: Vec<()>,
}
impl Default for BinTree {
fn default() -> Self {
Self {
version: 3,
is_override: false,
objects: IndexMap::new(),
dependencies: Vec::new(),
data_overrides: Vec::new(),
}
}
}
impl BinTree {
pub fn new(
objects: impl IntoIterator<Item = BinTreeObject>,
dependencies: impl IntoIterator<Item = impl Into<String>>,
) -> Self {
Self {
version: 3,
is_override: false,
objects: objects
.into_iter()
.map(|o: BinTreeObject| (o.path_hash, o))
.collect(),
dependencies: dependencies.into_iter().map(Into::into).collect(),
data_overrides: Vec::new(),
}
}
pub fn builder() -> BinTreeBuilder {
BinTreeBuilder::new()
}
#[inline]
pub fn len(&self) -> usize {
self.objects.len()
}
#[inline]
pub fn is_empty(&self) -> bool {
self.objects.is_empty()
}
#[inline]
pub fn get_object(&self, path_hash: u32) -> Option<&BinTreeObject> {
self.objects.get(&path_hash)
}
#[inline]
pub fn get_object_mut(&mut self, path_hash: u32) -> Option<&mut BinTreeObject> {
self.objects.get_mut(&path_hash)
}
#[inline]
pub fn contains_object(&self, path_hash: u32) -> bool {
self.objects.contains_key(&path_hash)
}
pub fn add_object(&mut self, object: BinTreeObject) -> Option<BinTreeObject> {
self.objects.insert(object.path_hash, object)
}
pub fn remove_object(&mut self, path_hash: u32) -> Option<BinTreeObject> {
self.objects.shift_remove(&path_hash)
}
pub fn add_dependency(&mut self, dependency: impl Into<String>) {
self.dependencies.push(dependency.into());
}
#[inline]
pub fn iter(&self) -> impl Iterator<Item = (&u32, &BinTreeObject)> {
self.objects.iter()
}
#[inline]
pub fn iter_mut(&mut self) -> impl Iterator<Item = (&u32, &mut BinTreeObject)> {
self.objects.iter_mut()
}
}
impl<'a> IntoIterator for &'a BinTree {
type Item = (&'a u32, &'a BinTreeObject);
type IntoIter = indexmap::map::Iter<'a, u32, BinTreeObject>;
fn into_iter(self) -> Self::IntoIter {
self.objects.iter()
}
}
impl<'a> IntoIterator for &'a mut BinTree {
type Item = (&'a u32, &'a mut BinTreeObject);
type IntoIter = indexmap::map::IterMut<'a, u32, BinTreeObject>;
fn into_iter(self) -> Self::IntoIter {
self.objects.iter_mut()
}
}
impl IntoIterator for BinTree {
type Item = (u32, BinTreeObject);
type IntoIter = indexmap::map::IntoIter<u32, BinTreeObject>;
fn into_iter(self) -> Self::IntoIter {
self.objects.into_iter()
}
}
#[derive(Debug, Default, Clone)]
pub struct BinTreeBuilder {
is_override: bool,
objects: Vec<BinTreeObject>,
dependencies: Vec<String>,
}
impl BinTreeBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn is_override(mut self, is_override: bool) -> Self {
self.is_override = is_override;
self
}
pub fn dependency(mut self, dep: impl Into<String>) -> Self {
self.dependencies.push(dep.into());
self
}
pub fn dependencies(mut self, deps: impl IntoIterator<Item = impl Into<String>>) -> Self {
self.dependencies.extend(deps.into_iter().map(Into::into));
self
}
pub fn object(mut self, obj: BinTreeObject) -> Self {
self.objects.push(obj);
self
}
pub fn objects(mut self, objs: impl IntoIterator<Item = BinTreeObject>) -> Self {
self.objects.extend(objs);
self
}
pub fn build(self) -> BinTree {
BinTree {
version: 3,
is_override: self.is_override,
objects: self.objects.into_iter().map(|o| (o.path_hash, o)).collect(),
dependencies: self.dependencies,
data_overrides: Vec::new(),
}
}
}