openstack_keystone_core/role/
mod.rs1use async_trait::async_trait;
35use std::collections::{BTreeMap, BTreeSet};
36
37pub mod backend;
38pub mod error;
39#[cfg(any(test, feature = "mock"))]
40mod mock;
41pub mod service;
42pub mod types;
43
44use crate::config::Config;
45use crate::keystone::ServiceState;
46use crate::plugin_manager::PluginManagerApi;
47use crate::role::{service::RoleService, types::*};
48
49pub use error::RoleProviderError;
50#[cfg(any(test, feature = "mock"))]
51pub use mock::MockRoleProvider;
52pub use types::RoleApi;
53
54pub enum RoleProvider {
55 Service(RoleService),
56 #[cfg(any(test, feature = "mock"))]
57 Mock(MockRoleProvider),
58}
59
60impl RoleProvider {
61 pub fn new<P: PluginManagerApi>(
62 config: &Config,
63 plugin_manager: &P,
64 ) -> Result<Self, RoleProviderError> {
65 Ok(Self::Service(RoleService::new(config, plugin_manager)?))
66 }
67}
68
69#[async_trait]
70impl RoleApi for RoleProvider {
71 #[tracing::instrument(level = "info", skip(self, state))]
73 async fn create_role(
74 &self,
75 state: &ServiceState,
76 params: RoleCreate,
77 ) -> Result<Role, RoleProviderError> {
78 match self {
79 Self::Service(provider) => provider.create_role(state, params).await,
80 #[cfg(any(test, feature = "mock"))]
81 Self::Mock(provider) => provider.create_role(state, params).await,
82 }
83 }
84
85 #[tracing::instrument(level = "info", skip(self, state))]
87 async fn delete_role<'a>(
88 &self,
89 state: &ServiceState,
90 id: &'a str,
91 ) -> Result<(), RoleProviderError> {
92 match self {
93 Self::Service(provider) => provider.delete_role(state, id).await,
94 #[cfg(any(test, feature = "mock"))]
95 Self::Mock(provider) => provider.delete_role(state, id).await,
96 }
97 }
98
99 async fn get_role<'a>(
101 &self,
102 state: &ServiceState,
103 id: &'a str,
104 ) -> Result<Option<Role>, RoleProviderError> {
105 match self {
106 Self::Service(provider) => provider.get_role(state, id).await,
107 #[cfg(any(test, feature = "mock"))]
108 Self::Mock(provider) => provider.get_role(state, id).await,
109 }
110 }
111
112 async fn expand_implied_roles(
116 &self,
117 state: &ServiceState,
118 roles: &mut Vec<RoleRef>,
119 ) -> Result<(), RoleProviderError> {
120 match self {
121 Self::Service(provider) => provider.expand_implied_roles(state, roles).await,
122 #[cfg(any(test, feature = "mock"))]
123 Self::Mock(provider) => provider.expand_implied_roles(state, roles).await,
124 }
125 }
126
127 async fn list_imply_rules(
129 &self,
130 state: &ServiceState,
131 resolve: bool,
132 ) -> Result<BTreeMap<String, BTreeSet<String>>, RoleProviderError> {
133 match self {
134 Self::Service(provider) => provider.list_imply_rules(state, resolve).await,
135 #[cfg(any(test, feature = "mock"))]
136 Self::Mock(provider) => provider.list_imply_rules(state, resolve).await,
137 }
138 }
139
140 async fn list_roles(
142 &self,
143 state: &ServiceState,
144 params: &RoleListParameters,
145 ) -> Result<Vec<Role>, RoleProviderError> {
146 match self {
147 Self::Service(provider) => provider.list_roles(state, params).await,
148 #[cfg(any(test, feature = "mock"))]
149 Self::Mock(provider) => provider.list_roles(state, params).await,
150 }
151 }
152}