1use serde::Serialize;
2
3use super::Document;
4
5#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize)]
7pub enum SearchFilter {
8 RfcsOnly,
10 DraftsOnly,
12 #[default]
14 Both,
15}
16
17impl SearchFilter {
18 pub fn api_param(&self) -> Option<&'static str> {
20 match self {
21 SearchFilter::RfcsOnly => Some("rfc"),
22 SearchFilter::DraftsOnly => Some("draft"),
23 SearchFilter::Both => None,
24 }
25 }
26}
27
28#[derive(Debug, Clone, Default, Serialize)]
30pub struct SearchResult {
31 pub documents: Vec<Document>,
33 pub has_more: bool,
35 pub total_count: Option<u32>,
37 pub query: String,
39 pub filter: SearchFilter,
41}
42
43impl SearchResult {
44 #[must_use]
46 pub fn is_empty(&self) -> bool {
47 self.documents.is_empty()
48 }
49
50 #[must_use]
52 pub fn len(&self) -> usize {
53 self.documents.len()
54 }
55}
56
57#[cfg(test)]
58mod tests {
59 use super::*;
60
61 #[test]
62 fn test_search_filter_api_param() {
63 assert_eq!(SearchFilter::RfcsOnly.api_param(), Some("rfc"));
64 assert_eq!(SearchFilter::DraftsOnly.api_param(), Some("draft"));
65 assert_eq!(SearchFilter::Both.api_param(), None);
66 }
67
68 #[test]
69 fn test_search_filter_default() {
70 assert_eq!(SearchFilter::default(), SearchFilter::Both);
71 }
72
73 #[test]
74 fn test_search_result_default() {
75 let result = SearchResult::default();
76
77 assert!(result.is_empty());
78 assert_eq!(result.len(), 0);
79 assert!(!result.has_more);
80 assert!(result.query.is_empty());
81 assert_eq!(result.filter, SearchFilter::Both);
82 }
83}