1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
use crate::schema::{Field, OwnedValue};

/// `FieldValue` holds together a `Field` and its `Value`.
#[allow(missing_docs)]
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct FieldValue {
    pub field: Field,
    pub value: OwnedValue,
}

impl FieldValue {
    /// Constructor
    pub fn new(field: Field, value: OwnedValue) -> FieldValue {
        FieldValue { field, value }
    }

    /// Field accessor
    pub fn field(&self) -> Field {
        self.field
    }

    /// Value accessor
    pub fn value(&self) -> &OwnedValue {
        &self.value
    }
}

impl From<FieldValue> for OwnedValue {
    fn from(field_value: FieldValue) -> Self {
        field_value.value
    }
}

/// A helper wrapper for creating standard iterators
/// out of the fields iterator trait.
pub struct FieldValueIter<'a>(pub(crate) std::slice::Iter<'a, FieldValue>);

impl<'a> Iterator for FieldValueIter<'a> {
    type Item = (Field, &'a OwnedValue);

    fn next(&mut self) -> Option<Self::Item> {
        self.0
            .next()
            .map(|field_value| (field_value.field, &field_value.value))
    }
}