keri_controller/
oobi.rs

1use keri_core::{
2    oobi::{EndRole, LocationScheme, Role},
3    prefix::IdentifierPrefix,
4    query::reply_event::ReplyRoute,
5};
6
7use crate::{error::ControllerError, identifier::Identifier, known_events::OobiRetrieveError};
8
9impl Identifier {
10    pub fn get_location(
11        &self,
12        identifier: &IdentifierPrefix,
13    ) -> Result<Vec<LocationScheme>, OobiRetrieveError> {
14        self.known_events.get_loc_schemas(identifier)
15    }
16
17    pub fn get_role_location(
18        &self,
19        id: &IdentifierPrefix,
20        role: Role,
21    ) -> Result<Vec<LocationScheme>, ControllerError> {
22        Ok(self
23            .known_events
24            .oobi_manager
25            .get_end_role(id, role)?
26            .unwrap_or_default()
27            .into_iter()
28            .filter_map(|r| {
29                if let ReplyRoute::EndRoleAdd(adds) = r.reply.get_route() {
30                    let locations = self
31                        .known_events
32                        .oobi_manager
33                        .get_loc_scheme(&adds.eid)
34                        .unwrap_or_default()
35                        .into_iter();
36                    Some(locations.filter_map(|rep| {
37                        if let ReplyRoute::LocScheme(loc) = rep.data.data {
38                            Some(loc)
39                        } else {
40                            None
41                        }
42                    }))
43                } else {
44                    None
45                }
46            })
47            .flatten()
48            .collect())
49    }
50
51    pub fn get_end_role(
52        &self,
53        id: &IdentifierPrefix,
54        role: Role,
55    ) -> Result<Vec<EndRole>, ControllerError> {
56        let end_roles = self
57            .known_events
58            .oobi_manager
59            .get_end_role(id, role)?
60            .unwrap_or_default()
61            .into_iter()
62            .map(|reply| match reply.reply.data.data {
63                ReplyRoute::EndRoleAdd(end_role) => end_role,
64                _ => todo!(),
65            })
66            .collect();
67        Ok(end_roles)
68    }
69}