/* 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 crate::{Filter, MultiBehaviour, Query, Sort, SortOrder, Value, ValueSort}; impl Query { pub fn show(&self) -> String { let mut o = String::new(); if !matches!(self.filter, Filter::True) { o += &format!("FILTER {} ", self.filter.show()) } if !matches!(self.sort, Sort::None) { o += &format!("SORT {} ", self.sort.show()) } o } } impl Filter { pub fn show(&self) -> String { match self { Filter::True => "TRUE".to_string(), Filter::All(filters) => format!( "({})", filters .iter() .map(|f| f.show()) .collect::>() .join(" AND ") ), Filter::Any(filters) => format!( "({})", filters .iter() .map(|f| f.show()) .collect::>() .join(" OR ") ), Filter::Match(path, value) => { format!("{path} = {}", show_value(value)) } Filter::Has(path) => format!("{path}"), } } } impl Sort { pub fn show(&self) -> String { match self { Sort::None => "NONE".to_string(), Sort::Value(ValueSort { multi, order, path, .. }) => { format!( "{} BY {} {path}", match order { SortOrder::Ascending => "ASCENDING", SortOrder::Descending => "DESCENDING", }, match multi { MultiBehaviour::Count => "COUNT", MultiBehaviour::First => "FIRST", MultiBehaviour::ForEach => "EACH", MultiBehaviour::Max => "MAX", MultiBehaviour::Min => "MIN", }, ) } Sort::TextSearch(path, value) => { format!("TEXT SEARCH {path} = {value:?}") } } } } fn show_value(value: &Value) -> String { match value { Value::Tag(tag) => format!("{tag}"), Value::U32(x) => format!("{x}"), Value::U64(x) => format!("{x}"), Value::I64(x) => format!("{x}"), Value::String(x) => format!("{x:?}"), Value::Binary(x) => format!("{x:?}"), } }