server: catalog v1

This commit is contained in:
nym21
2025-10-06 12:52:18 +02:00
parent 1c6ece48a8
commit db344749b6
12 changed files with 344 additions and 76 deletions
+33 -4
View File
@@ -1,5 +1,5 @@
use std::{
collections::{BTreeMap, HashMap},
collections::{BTreeMap, BTreeSet},
fmt::Debug,
};
@@ -16,13 +16,42 @@ pub trait Traversable {
fn iter_any_collectable(&self) -> impl Iterator<Item = &dyn AnyCollectableVec>;
}
#[derive(Debug, Clone, Serialize)]
#[derive(Debug, Clone, Serialize, PartialEq, Eq)]
#[serde(untagged)]
pub enum TreeNode {
Branch(HashMap<String, TreeNode>),
Branch(BTreeMap<String, TreeNode>),
List(Vec<TreeNode>),
Leaf(String),
}
impl TreeNode {
pub fn collect_unique_leaves(self) -> TreeNode {
let mut out = BTreeSet::new();
fn recurse(n: TreeNode, out: &mut BTreeSet<String>) {
match n {
TreeNode::Leaf(s) => {
out.insert(s);
}
TreeNode::Branch(map) => {
map.into_values().for_each(|n| recurse(n, out));
}
TreeNode::List(vec) => {
vec.into_iter().for_each(|n| recurse(n, out));
}
}
}
recurse(self, &mut out);
match out.len() {
0 => TreeNode::List(vec![]),
1 => TreeNode::Leaf(out.into_iter().next().unwrap()),
_ => TreeNode::List(out.into_iter().map(TreeNode::Leaf).collect()),
}
}
}
impl<I, T> Traversable for RawVec<I, T>
where
I: StoredIndex,
@@ -169,7 +198,7 @@ impl<T: Traversable> Traversable for Option<T> {
fn to_tree_node(&self) -> TreeNode {
match self {
Some(inner) => inner.to_tree_node(),
None => TreeNode::Branch(HashMap::new()),
None => TreeNode::Branch(BTreeMap::new()),
}
}