1
use bonsaidb::core::{
2
    document::{CollectionDocument, Emit},
3
    schema::{
4
        view::CollectionViewSchema, Collection, ReduceResult, View, ViewMapResult, ViewMappedValue,
5
    },
6
};
7
use serde::{Deserialize, Serialize};
8

            
9
334
#[derive(Debug, Serialize, Deserialize, Collection)]
10
#[collection(name = "shapes", views = [ShapesByNumberOfSides])]
11
pub struct Shape {
12
    pub sides: u32,
13
}
14

            
15
impl Shape {
16
106
    pub fn new(sides: u32) -> Self {
17
106
        Self { sides }
18
106
    }
19
}
20

            
21
379
#[derive(Debug, Clone, View)]
22
#[view(collection = Shape, key = u32, value = usize, name = "by-number-of-sides")]
23
pub struct ShapesByNumberOfSides;
24

            
25
impl CollectionViewSchema for ShapesByNumberOfSides {
26
    type View = Self;
27

            
28
104
    fn map(
29
104
        &self,
30
104
        document: CollectionDocument<<Self::View as View>::Collection>,
31
104
    ) -> ViewMapResult<Self::View> {
32
104
        document
33
104
            .header
34
104
            .emit_key_and_value(document.contents.sides, 1)
35
104
    }
36

            
37
15
    fn reduce(
38
15
        &self,
39
15
        mappings: &[ViewMappedValue<Self::View>],
40
15
        _rereduce: bool,
41
15
    ) -> ReduceResult<Self::View> {
42
161
        Ok(mappings.iter().map(|m| m.value).sum())
43
15
    }
44
}