Skip to main content

edc_web_components/models/
policy_definition.rs

1use crate::models::PolicyKind;
2use base64::Engine;
3use base64::prelude::BASE64_STANDARD;
4use edc_connector_client::types::policy::{
5  Obligation, Permission, Policy, PolicyDefinition, Prohibition,
6};
7use std::collections::HashMap;
8
9#[derive(Clone, Debug, PartialEq)]
10pub struct PolicyDefinitionItem {
11  pub id: String,
12  pub name: String,
13  pub kind: String,
14  pub permissions: Vec<Permission>,
15  pub obligations: Vec<Obligation>,
16  pub prohibitions: Vec<Prohibition>,
17  pub extensible_properties: HashMap<String, serde_json::Value>,
18  pub assignee: Option<String>,
19  pub assigner: Option<String>,
20}
21
22impl From<PolicyDefinition> for PolicyDefinitionItem {
23  fn from(policy_definition: PolicyDefinition) -> Self {
24    PolicyDefinitionItem {
25      id: policy_definition.id().to_string(),
26      name: policy_definition
27        .private_property("name")
28        .ok()
29        .and_then(|name| name)
30        .unwrap_or(extract_id(policy_definition.id().to_string())),
31      kind: PolicyKind::from(policy_definition.policy().kind()).to_string(),
32      permissions: policy_definition.policy().permissions().to_vec(),
33      obligations: policy_definition.policy().obligations().to_vec(),
34      prohibitions: policy_definition.policy().prohibitions().to_vec(),
35      extensible_properties: policy_definition.policy().extensible_properties().clone(),
36      assignee: policy_definition
37        .policy()
38        .assignee()
39        .map(|assignee| assignee.to_string()),
40      assigner: policy_definition
41        .policy()
42        .assigner()
43        .map(|assigner| assigner.to_string()),
44    }
45  }
46}
47
48impl From<&Policy> for PolicyDefinitionItem {
49  fn from(policy: &Policy) -> Self {
50    PolicyDefinitionItem {
51      id: policy.id().cloned().unwrap_or_default(),
52      name: extract_id(policy.id().cloned().unwrap_or_default()),
53      kind: PolicyKind::from(policy.kind()).to_string(),
54      permissions: policy.permissions().to_vec(),
55      obligations: policy.obligations().to_vec(),
56      prohibitions: policy.prohibitions().to_vec(),
57      extensible_properties: policy.extensible_properties().clone(),
58      assignee: policy.assignee().cloned(),
59      assigner: policy.assigner().cloned(),
60    }
61  }
62}
63
64pub fn extract_id(offer_id: String) -> String {
65  if let Some(value) = offer_id.split(":").next() {
66    BASE64_STANDARD
67      .decode(value)
68      .ok()
69      .and_then(|offer| String::from_utf8(offer).ok())
70      .unwrap()
71  } else {
72    offer_id
73  }
74}