security_client_rs/
roles.rs1use std::collections::BTreeMap;
3
4use serde::{Deserialize, Serialize};
5use serde_json::{Map, Value};
6
7use crate::{
8 Kibana, Scope,
9 http::{Empty, Method},
10 request::endpoint,
11};
12
13#[derive(Clone, Debug, Serialize, Deserialize)]
14#[non_exhaustive]
15pub struct KibanaPrivilege {
16 pub spaces: Vec<String>,
17 #[serde(default)]
18 pub base: Vec<String>,
19 #[serde(default)]
20 pub feature: BTreeMap<String, Vec<String>>,
21}
22
23impl KibanaPrivilege {
24 pub fn new(spaces: Vec<String>, base: Vec<String>) -> Self {
26 Self {
27 spaces,
28 base,
29 feature: BTreeMap::new(),
30 }
31 }
32}
33
34#[derive(Clone, Debug, Serialize, Deserialize)]
36#[non_exhaustive]
37pub struct RoleDefinition {
38 pub elasticsearch: Value,
40 #[serde(default)]
41 pub kibana: Vec<KibanaPrivilege>,
42 #[serde(default, skip_serializing_if = "Option::is_none")]
43 pub description: Option<String>,
44 #[serde(default, skip_serializing_if = "Option::is_none")]
45 pub metadata: Option<Map<String, Value>>,
46}
47
48impl RoleDefinition {
49 pub fn new(elasticsearch: Value, kibana: Vec<KibanaPrivilege>) -> Self {
50 Self {
51 elasticsearch,
52 kibana,
53 description: None,
54 metadata: None,
55 }
56 }
57}
58
59#[derive(Clone, Debug, Serialize, Deserialize)]
63#[non_exhaustive]
64pub struct Role {
65 pub name: String,
66 #[serde(flatten)]
67 pub definition: RoleDefinition,
68 #[serde(flatten)]
70 pub extra: Map<String, Value>,
71}
72
73#[derive(Clone, Copy, Debug)]
74pub struct Roles<'a>(pub(crate) &'a Kibana);
75
76impl<'a> Roles<'a> {
77 pub fn list(&self) -> ListRoles<'a> {
78 ListRoles(
79 self.0
80 .request(Method::GET, Scope::Global, &["api", "security", "role"]),
81 )
82 }
83
84 pub fn get(&self, name: &str) -> GetRole<'a> {
85 GetRole(self.0.request(
86 Method::GET,
87 Scope::Global,
88 &["api", "security", "role", name],
89 ))
90 }
91
92 pub fn put<B: Serialize + ?Sized>(&self, name: &str, role: &B) -> PutRole<'a> {
94 PutRole(
95 self.0
96 .request(
97 Method::PUT,
98 Scope::Global,
99 &["api", "security", "role", name],
100 )
101 .json(role),
102 )
103 }
104
105 pub fn delete(&self, name: &str) -> DeleteRole<'a> {
106 DeleteRole(self.0.request(
107 Method::DELETE,
108 Scope::Global,
109 &["api", "security", "role", name],
110 ))
111 }
112}
113
114endpoint! {
115 ListRoles => Vec<Role>
117}
118
119endpoint! {
120 GetRole => Role
122}
123
124endpoint! {
125 PutRole => Empty
127}
128
129impl PutRole<'_> {
130 pub fn create_only(self, enabled: bool) -> Self {
132 Self(self.0.param("createOnly", enabled))
133 }
134}
135
136endpoint! {
137 DeleteRole => Empty
139}