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}