kanidm_cli/schema/
attr.rs

1use crate::{handle_client_error, OpType, SchemaAttrOpt};
2use kanidm_proto::scim_v1::{ScimEntryGetQuery, ScimFilter};
3use std::str::FromStr;
4
5impl SchemaAttrOpt {
6    pub fn debug(&self) -> bool {
7        match self {
8            Self::List { copt } | Self::Search { copt, .. } => copt.debug,
9        }
10    }
11
12    pub async fn exec(&self) {
13        match self {
14            Self::List { copt } => {
15                let client = copt.to_client(OpType::Read).await;
16
17                let attrs = match client.scim_schema_attribute_list(None).await {
18                    Ok(attrs) => attrs,
19                    Err(e) => {
20                        handle_client_error(e, copt.output_mode);
21                        return;
22                    }
23                };
24
25                for attr in attrs.resources {
26                    println!("---");
27                    println!("uuid: {}", attr.header.id);
28                    println!("attribute_name: {}", attr.attributename);
29                    println!("description: {}", attr.description);
30                    println!("multivalue: {}", attr.multivalue);
31                    println!("unique: {}", attr.unique);
32                    println!("syntax: {}", attr.syntax);
33                }
34            }
35            Self::Search { copt, query } => {
36                let query = match ScimFilter::from_str(query) {
37                    Ok(query) => query,
38                    Err(err) => {
39                        error!("Invalid search query");
40                        error!(?err);
41                        return;
42                    }
43                };
44
45                let get_query = ScimEntryGetQuery {
46                    filter: Some(query),
47                    ..Default::default()
48                };
49
50                let client = copt.to_client(OpType::Read).await;
51
52                let attrs = match client.scim_schema_attribute_list(Some(get_query)).await {
53                    Ok(attrs) => attrs,
54                    Err(e) => {
55                        handle_client_error(e, copt.output_mode);
56                        return;
57                    }
58                };
59
60                for attr in attrs.resources {
61                    println!("---");
62                    println!("uuid: {}", attr.header.id);
63                    println!("attribute_name: {}", attr.attributename);
64                    println!("description: {}", attr.description);
65                    println!("multivalue: {}", attr.multivalue);
66                    println!("unique: {}", attr.unique);
67                    println!("syntax: {}", attr.syntax);
68                }
69            }
70        }
71    }
72}