Skip to main content

coil_core/manifest/
search.rs

1use super::*;
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq)]
4pub enum SearchDocumentKind {
5    Page,
6    Product,
7    Collection,
8    Event,
9    EventSlot,
10    Booking,
11    Media,
12    MembershipSubscription,
13    Custom,
14}
15
16#[derive(Debug, Clone, Copy, PartialEq, Eq)]
17pub enum SearchFieldRole {
18    Title,
19    Summary,
20    Body,
21    Keyword,
22    Facet,
23    Metadata,
24}
25
26#[derive(Debug, Clone, Copy, PartialEq, Eq)]
27pub enum SearchVisibility {
28    Public,
29    Authenticated,
30    Capability(Capability),
31}
32
33impl SearchVisibility {
34    pub fn allows(&self, capabilities: &[Capability]) -> bool {
35        match self {
36            Self::Public => true,
37            Self::Authenticated => !capabilities.is_empty(),
38            Self::Capability(capability) => capabilities.contains(capability),
39        }
40    }
41}
42
43#[derive(Debug, Clone, Copy, PartialEq, Eq)]
44pub enum SearchInvalidationTrigger {
45    Published,
46    Updated,
47    Unpublished,
48    Deleted,
49    ManualRebuild,
50}
51
52#[derive(Debug, Clone, Copy, PartialEq, Eq)]
53pub enum SearchRebuildStrategy {
54    OnInvalidate,
55    Scheduled { interval: Duration },
56    ManualOnly,
57}
58
59#[derive(Debug, Clone, PartialEq, Eq)]
60pub struct SearchFieldContribution {
61    pub id: String,
62    pub source_path: String,
63    pub role: SearchFieldRole,
64    pub stored: bool,
65    pub searchable: bool,
66}
67
68impl SearchFieldContribution {
69    pub fn new(
70        id: impl Into<String>,
71        source_path: impl Into<String>,
72        role: SearchFieldRole,
73        stored: bool,
74        searchable: bool,
75    ) -> Self {
76        Self {
77            id: id.into(),
78            source_path: source_path.into(),
79            role,
80            stored,
81            searchable,
82        }
83    }
84}
85
86#[derive(Debug, Clone, PartialEq, Eq)]
87pub struct SearchInvalidationRule {
88    pub trigger: SearchInvalidationTrigger,
89    pub reason: String,
90}
91
92impl SearchInvalidationRule {
93    pub fn new(trigger: SearchInvalidationTrigger, reason: impl Into<String>) -> Self {
94        Self {
95            trigger,
96            reason: reason.into(),
97        }
98    }
99}
100
101#[derive(Debug, Clone, PartialEq, Eq)]
102pub struct SearchIndexContribution {
103    pub id: String,
104    pub document_kind: SearchDocumentKind,
105    pub visibility: SearchVisibility,
106    pub publication_required: bool,
107    pub fields: Vec<SearchFieldContribution>,
108    pub invalidation_rules: Vec<SearchInvalidationRule>,
109    pub rebuild_strategy: SearchRebuildStrategy,
110}
111
112impl SearchIndexContribution {
113    pub fn new(
114        id: impl Into<String>,
115        document_kind: SearchDocumentKind,
116        visibility: SearchVisibility,
117        publication_required: bool,
118        fields: Vec<SearchFieldContribution>,
119        invalidation_rules: Vec<SearchInvalidationRule>,
120        rebuild_strategy: SearchRebuildStrategy,
121    ) -> Self {
122        Self {
123            id: id.into(),
124            document_kind,
125            visibility,
126            publication_required,
127            fields,
128            invalidation_rules,
129            rebuild_strategy,
130        }
131    }
132}