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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
use futures::future::Future;
use std::io;
use std::pin::Pin;

#[derive(Clone, PartialEq, Eq, Debug)]
pub struct Label {
    pub name: String,
    pub layer: Option<[u32; 5]>,
    pub version: u64,
}

impl Label {
    pub fn new_empty(name: &str) -> Label {
        Label {
            name: name.to_owned(),
            layer: None,
            version: 0,
        }
    }
    pub fn new(name: &str, layer: [u32; 5]) -> Label {
        Label {
            name: name.to_owned(),
            layer: Some(layer),
            version: 0,
        }
    }

    pub fn with_updated_layer(&self, layer: Option<[u32; 5]>) -> Label {
        Label {
            name: self.name.clone(),
            layer,
            version: self.version + 1,
        }
    }
}

pub trait LabelStore: Send + Sync {
    fn labels(&self) -> Pin<Box<dyn Future<Output = io::Result<Vec<Label>>> + Send>>;
    fn create_label(&self, name: &str) -> Pin<Box<dyn Future<Output = io::Result<Label>> + Send>>;
    fn get_label(
        &self,
        name: &str,
    ) -> Pin<Box<dyn Future<Output = io::Result<Option<Label>>> + Send>>;
    fn set_label_option(
        &self,
        label: &Label,
        layer: Option<[u32; 5]>,
    ) -> Pin<Box<dyn Future<Output = io::Result<Option<Label>>> + Send>>;

    fn set_label(
        &self,
        label: &Label,
        layer: [u32; 5],
    ) -> Pin<Box<dyn Future<Output = io::Result<Option<Label>>> + Send>> {
        self.set_label_option(label, Some(layer))
    }

    fn clear_label(
        &self,
        label: &Label,
    ) -> Pin<Box<dyn Future<Output = io::Result<Option<Label>>> + Send>> {
        self.set_label_option(label, None)
    }
}