use crate::models::PolicyKind;
use base64::Engine;
use base64::prelude::BASE64_STANDARD;
use edc_connector_client::types::policy::{
Obligation, Permission, Policy, PolicyDefinition, Prohibition,
};
use std::collections::HashMap;
#[derive(Clone, Debug, PartialEq)]
pub struct PolicyDefinitionItem {
pub id: String,
pub name: String,
pub kind: String,
pub permissions: Vec<Permission>,
pub obligations: Vec<Obligation>,
pub prohibitions: Vec<Prohibition>,
pub extensible_properties: HashMap<String, serde_json::Value>,
pub assignee: Option<String>,
pub assigner: Option<String>,
}
impl From<PolicyDefinition> for PolicyDefinitionItem {
fn from(policy_definition: PolicyDefinition) -> Self {
PolicyDefinitionItem {
id: policy_definition.id().to_string(),
name: policy_definition
.private_property("name")
.ok()
.and_then(|name| name)
.unwrap_or(extract_id(policy_definition.id().to_string())),
kind: PolicyKind::from(policy_definition.policy().kind()).to_string(),
permissions: policy_definition.policy().permissions().to_vec(),
obligations: policy_definition.policy().obligations().to_vec(),
prohibitions: policy_definition.policy().prohibitions().to_vec(),
extensible_properties: policy_definition.policy().extensible_properties().clone(),
assignee: policy_definition
.policy()
.assignee()
.map(|assignee| assignee.to_string()),
assigner: policy_definition
.policy()
.assigner()
.map(|assigner| assigner.to_string()),
}
}
}
impl From<&Policy> for PolicyDefinitionItem {
fn from(policy: &Policy) -> Self {
PolicyDefinitionItem {
id: policy.id().cloned().unwrap_or_default(),
name: extract_id(policy.id().cloned().unwrap_or_default()),
kind: PolicyKind::from(policy.kind()).to_string(),
permissions: policy.permissions().to_vec(),
obligations: policy.obligations().to_vec(),
prohibitions: policy.prohibitions().to_vec(),
extensible_properties: policy.extensible_properties().clone(),
assignee: policy.assignee().cloned(),
assigner: policy.assigner().cloned(),
}
}
}
pub fn extract_id(offer_id: String) -> String {
offer_id
.split(":")
.next()
.and_then(|value| {
BASE64_STANDARD
.decode(value)
.ok()
.and_then(|offer| String::from_utf8(offer).ok())
})
.unwrap_or(offer_id)
}