edc-web-components 0.8.1

A Rust Web Components with patternfly-yew client for EDC
Documentation
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)
}