edc_web_components/models/
policy_definition.rs1use 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}