/* This file is part of jellything (https://codeberg.org/metamuffin/jellything) which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2026 metamuffin */ use jellyobject::{Object, Path}; /// Sorted list of components to bin objects by filterable values. #[derive(Debug, Clone, PartialEq, Eq)] pub struct Binning(Vec); #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord)] pub enum BinningComponent { Has(Path), Match(Path), } impl Binning { pub fn new(mut comps: Vec) -> Self { comps.sort(); Self(comps) } pub fn apply(&self, ob: Object<'_>, keys: &mut Vec>) { for f in &self.0 { f.apply(ob, keys); } } } impl BinningComponent { pub fn apply(&self, ob: Object<'_>, keys: &mut Vec>) { match self { BinningComponent::Has(path) => { let has = path.get_matching_value(ob).is_some(); for co in keys { co.push(has as u8) } } BinningComponent::Match(path) => { let mut new_out = Vec::new(); for value in path.get_matching_values(ob) { for mut co in keys.clone() { co.extend((co.len() as u32).to_be_bytes()); co.extend(value); new_out.push(co); } } *keys = new_out; } } } }