use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct MetadataFilter {
pub persons: Option<Vec<String>>,
pub location: Option<String>,
pub entities: Option<Vec<String>>,
pub timestamp_range: Option<(DateTime<Utc>, DateTime<Utc>)>,
}
impl MetadataFilter {
#[must_use]
pub const fn is_empty(&self) -> bool {
self.persons.is_none()
&& self.location.is_none()
&& self.entities.is_none()
&& self.timestamp_range.is_none()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn is_empty_checks_all_fields() {
assert!(MetadataFilter::default().is_empty());
let now = Utc::now();
let cases: Vec<MetadataFilter> = vec![
MetadataFilter {
persons: Some(vec!["Alice".into()]),
..Default::default()
},
MetadataFilter {
location: Some("Tokyo".into()),
..Default::default()
},
MetadataFilter {
entities: Some(vec!["OpenAI".into()]),
..Default::default()
},
MetadataFilter {
timestamp_range: Some((now, now)),
..Default::default()
},
];
for f in &cases {
assert!(!f.is_empty(), "expected non-empty for {f:?}");
}
}
}