summaryrefslogtreecommitdiffstats
path: root/src/schema.rs
blob: bab5809530d8d39ee80fbe6796ba0377be8bc60a (plain)
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
65
use crate::data::Data;
use failure::{Error, err_msg};
use std::collections::HashSet;

#[derive(serde_derive::Deserialize, Debug)]
pub(crate) struct Person {
    name: String,
    github: String,
    irc: Option<String>,
}

impl Person {
    pub(crate) fn name(&self) -> &str {
        &self.name
    }

    pub(crate) fn github(&self) -> &str {
        &self.github
    }

    pub(crate) fn irc(&self) -> &str {
        if let Some(irc) = &self.irc {
            irc
        } else {
            &self.github
        }
    }
}

#[derive(serde_derive::Deserialize, Debug)]
pub(crate) struct Team {
    name: String,
    #[serde(default)]
    children: Vec<String>,
    people: TeamPeople,
}

impl Team {
    pub(crate) fn name(&self) -> &str {
        &self.name
    }

    pub(crate) fn leads(&self) -> HashSet<&str> {
        self.people.leads.iter().map(|s| s.as_str()).collect()
    }

    pub(crate) fn members<'a>(&'a self, data: &'a Data) -> Result<HashSet<&'a str>, Error> {
        let mut members: HashSet<_> = self.people.members.iter().map(|s| s.as_str()).collect();
        for subteam in &self.children {
            let submembers = data
                .team(&subteam)
                .ok_or_else(|| err_msg(format!("missing team {}", subteam)))?;
            for person in submembers.members(data)? {
                members.insert(person);
            }
        }
        Ok(members)
    }
}

#[derive(serde_derive::Deserialize, Debug)]
struct TeamPeople {
    leads: Vec<String>,
    members: Vec<String>,
}