Skip to main content

sluice/domain/
document.rs

1use super::field::Field;
2
3/// An index document: an ordered list of fields.
4///
5/// Order follows the on-wire layout. Documents average ~10 fields, so the
6/// linear-scan `find` helper is fine.
7#[derive(Debug, Clone, Default, PartialEq, Eq)]
8#[cfg_attr(feature = "serde", derive(serde::Serialize))]
9pub struct Document {
10    fields: Vec<Field>,
11}
12
13impl Document {
14    /// Construct a `Document` from an ordered list of fields.
15    #[must_use]
16    pub fn new(fields: Vec<Field>) -> Self {
17        Self { fields }
18    }
19
20    /// All fields in on-wire order.
21    #[must_use]
22    pub fn fields(&self) -> &[Field] {
23        &self.fields
24    }
25
26    /// Return the value of the first field whose name equals `key`.
27    #[must_use]
28    pub fn find(&self, key: &str) -> Option<&str> {
29        self.fields
30            .iter()
31            .find(|f| f.name == key)
32            .map(|f| f.value.as_str())
33    }
34
35    /// Return `true` if any field's name equals `key`.
36    #[must_use]
37    pub fn has(&self, key: &str) -> bool {
38        self.fields.iter().any(|f| f.name == key)
39    }
40}