edc_connector_client/api/
policies.rs1use crate::{
2 client::EdcConnectorClientInternal,
3 types::{
4 context::{WithContext, WithContextRef},
5 policy::{NewPolicyDefinition, PolicyDefinition},
6 query::Query,
7 response::IdResponse,
8 },
9 EdcResult,
10};
11
12pub struct PolicyApi<'a>(&'a EdcConnectorClientInternal);
13
14impl<'a> PolicyApi<'a> {
15 pub(crate) fn new(client: &'a EdcConnectorClientInternal) -> PolicyApi<'a> {
16 PolicyApi(client)
17 }
18
19 pub async fn create(
20 &self,
21 policy_definition: &NewPolicyDefinition,
22 ) -> EdcResult<IdResponse<String>> {
23 let url = self.get_endpoint(&[]);
24 self.0
25 .post::<_, WithContext<IdResponse<String>>>(
26 url,
27 &WithContextRef::odrl_context(policy_definition),
28 )
29 .await
30 .map(|ctx| ctx.inner)
31 }
32
33 pub async fn get(&self, id: &str) -> EdcResult<PolicyDefinition> {
34 let url = self.get_endpoint(&[id]);
35 self.0
36 .get::<WithContext<PolicyDefinition>>(url)
37 .await
38 .map(|ctx| ctx.inner)
39 }
40
41 pub async fn update(&self, policy_definition: &PolicyDefinition) -> EdcResult<()> {
42 let url = self.get_endpoint(&[policy_definition.id()]);
43 self.0
44 .put(url, &WithContextRef::odrl_context(policy_definition))
45 .await
46 }
47
48 pub async fn query(&self, query: Query) -> EdcResult<Vec<PolicyDefinition>> {
49 let url = self.get_endpoint(&["request"]);
50 self.0
51 .post::<_, Vec<WithContext<PolicyDefinition>>>(
52 url,
53 &WithContextRef::default_context(&query),
54 )
55 .await
56 .map(|results| results.into_iter().map(|ctx| ctx.inner).collect())
57 }
58
59 pub async fn delete(&self, id: &str) -> EdcResult<()> {
60 let url = self.get_endpoint(&[id]);
61 self.0.del(url).await
62 }
63
64 fn get_endpoint(&self, paths: &[&str]) -> String {
65 [self.0.management_url.as_str(), "v3", "policydefinitions"]
66 .into_iter()
67 .chain(paths.iter().copied())
68 .collect::<Vec<_>>()
69 .join("/")
70 }
71}