Skip to main content

edc_web_components/contexts/
policy_constraints_context.rs

1use edc_connector_client::types::policy::Constraint;
2use yew::prelude::*;
3
4#[derive(Debug, Clone, PartialEq)]
5pub struct PolicyConstraintRenderer {
6  pub action: String,
7  pub constraint: Constraint,
8  pub title: String,
9  pub inner: Html,
10}
11
12impl PolicyConstraintRenderer {
13  fn is(&self, action: &str, constraint: &Constraint) -> bool {
14    self.action == action && &self.constraint == constraint
15  }
16}
17
18#[derive(Clone, PartialEq)]
19pub struct PolicyConstraintRendererState {
20  constraints: Vec<PolicyConstraintRenderer>,
21}
22
23impl PolicyConstraintRendererState {
24  pub fn renderer_constraint(
25    &self,
26    action: &str,
27    constraint: &Constraint,
28  ) -> Option<(String, Html)> {
29    self
30      .constraints
31      .iter()
32      .find(|policy_constraint_renderer| policy_constraint_renderer.is(action, constraint))
33      .map(|policy_constraint_renderer| {
34        (
35          policy_constraint_renderer.title.to_string(),
36          policy_constraint_renderer.inner.clone(),
37        )
38      })
39  }
40}
41
42#[derive(Properties, PartialEq)]
43pub struct PolicyConstraintRendererContextProviderProps {
44  #[prop_or_default]
45  pub children: Html,
46  pub constraints: Vec<PolicyConstraintRenderer>,
47}
48
49#[component]
50pub fn PolicyConstraintRendererContextProvider(
51  props: &PolicyConstraintRendererContextProviderProps,
52) -> Html {
53  let context = use_state(move || PolicyConstraintRendererState {
54    constraints: props.constraints.clone(),
55  });
56
57  use_effect_with(
58    (props.constraints.clone(), context.setter()),
59    |(constraints, context_setter)| {
60      context_setter.set(PolicyConstraintRendererState {
61        constraints: constraints.clone(),
62      });
63    },
64  );
65
66  html! {
67    <ContextProvider<PolicyConstraintRendererState> context={(*context).clone()}>
68      { props.children.clone() }
69    </ContextProvider<PolicyConstraintRendererState>>
70  }
71}
72
73#[hook]
74pub fn use_policy_constraint_renderer_context() -> Option<PolicyConstraintRendererState> {
75  use_context::<PolicyConstraintRendererState>()
76}