use ciborium::Value as CborValue;
use vantage_types::Record;
use super::cell_get;
use crate::metadata::VistaMetadata;
pub(super) fn matches_search(
needle: &str,
row: &Record<CborValue>,
metadata: &VistaMetadata,
) -> bool {
let needle = needle.to_lowercase();
if needle.is_empty() {
return true;
}
if metadata.columns.is_empty() {
return row.values().any(|cell| contains(cell, &needle));
}
metadata
.search_columns()
.into_iter()
.filter_map(|column| cell_get(row, column, metadata))
.any(|cell| contains(cell, &needle))
}
fn contains(value: &CborValue, needle: &str) -> bool {
match value {
CborValue::Text(s) => s.to_lowercase().contains(needle),
CborValue::Integer(i) => i128::from(*i).to_string().contains(needle),
CborValue::Float(f) => f.to_string().contains(needle),
CborValue::Bool(b) => b.to_string().contains(needle),
CborValue::Tag(_, inner) => contains(inner, needle),
CborValue::Array(items) => items.iter().any(|item| contains(item, needle)),
CborValue::Map(entries) => entries.iter().any(|(_, v)| contains(v, needle)),
_ => false,
}
}