1use std::{collections::HashMap, sync::Mutex};
2
3use crate::{
4 condition::{Condition, Conditions},
5 effect::Effect,
6 principal::{Group, Role, User, UserKind},
7};
8
9type PolicyByUser<T> = HashMap<User, Policy<T>>;
10type PolicyByGroup<T> = HashMap<Group, Policy<T>>;
11type PolicyByRole<T> = HashMap<Role, Policy<T>>;
12type GroupByUser = HashMap<User, Group>;
13
14pub struct PolicyContainer<T> {
15 pub policy_by_user: PolicyByUser<T>,
16 pub policy_by_group: PolicyByGroup<T>,
17 pub policy_by_role: PolicyByRole<T>,
18 pub groups: GroupByUser,
19}
20
21impl<T> PolicyContainer<T> {
22 pub fn init() -> Self {
23 Self {
24 policy_by_user: PolicyByUser::new(),
25 policy_by_group: PolicyByGroup::new(),
26 policy_by_role: PolicyByRole::new(),
27 groups: GroupByUser::new(),
28 }
29 }
30
31 pub fn find_policy(&self, user: &User) -> Option<&T> {
32 self.groups
33 .get(user)
34 .and_then(|group| self.policy_by_group.get(group))
35 .map(|policy| &policy.type_)
36 }
37}
38
39pub fn do_a_call() {
40 }
46
47pub struct Policy<T> {
48 pub version: i32,
49 pub conditions: Vec<Conditions>,
51 pub type_: T,
54 pub effects: Vec<Effect>,
55}
56
57#[cfg(feature = "s3-policy")]
58pub mod s3_policy {
59 #[derive(Default)]
60 pub struct S3Policy {
61 pub input: S3InputPolicy,
62 pub output: Option<String>,
63 }
64
65 #[derive(Default)]
66 pub struct S3InputPolicy {
67 bucket: Bucket,
68 control: Option<Control>,
69 outpost: Option<Outpost>,
70 }
71
72 impl S3InputPolicy {
73 }
82
83 #[derive(Default)]
84 pub struct Bucket {
85 name: Name,
86 tag: Option<Tag>,
87 }
88
89 #[derive(Default)]
90 pub struct Outpost;
91
92 #[derive(Default)]
93 pub struct Control;
94
95 #[derive(Default)]
96 pub struct Name {
97 eq: Option<Vec<String>>,
98 start_with: Option<Vec<String>>,
99 in_: Option<Vec<String>>,
100 }
101
102 #[derive(Default)]
103 pub struct Tag;
104}