1use std::fmt::Display;
3
4use crate::value::PartialValue;
5use crate::value::Value;
6use crate::valueset::{ValueSet, ValueSetIutf8};
7pub use kanidm_proto::attribute::Attribute;
8use kanidm_proto::constants::*;
9use kanidm_proto::scim_v1::JsonValue;
10
11#[derive(Copy, Clone, Debug)]
17pub enum EntryClass {
18 AccessControlCreate,
19 AccessControlDelete,
20 AccessControlModify,
21 AccessControlProfile,
22 AccessControlReceiverEntryManager,
23 AccessControlReceiverGroup,
24 AccessControlSearch,
25 AccessControlTargetScope,
26 Account,
27 AccountPolicy,
28 Application,
29 AttributeType,
30 Builtin,
31 Class,
32 ClassType,
33 ClientCertificate,
34 Conflict,
35 DomainInfo,
36 DynGroup,
37 ExtensibleObject,
38 Group,
39 KeyProvider,
40 KeyProviderInternal,
41 KeyObject,
42 KeyObjectJwtEs256,
43 KeyObjectJwtRs256,
44 KeyObjectJweA128GCM,
45 KeyObjectInternal,
46 MemberOf,
47 OAuth2ResourceServer,
48 OAuth2ResourceServerBasic,
49 OAuth2ResourceServerPublic,
50 OAuth2DeviceCodeSession,
51 Object,
52 OrgPerson,
53 Person,
54 PosixAccount,
55 PosixGroup,
56 Recycled,
57 Service,
58 ServiceAccount,
59 SyncAccount,
60 SyncObject,
61 Tombstone,
62 User,
63 System,
64 SystemInfo,
65 SystemConfig,
66 #[cfg(any(test, debug_assertions))]
67 TestClass,
68}
69
70impl From<EntryClass> for &'static str {
71 fn from(val: EntryClass) -> Self {
72 match val {
73 EntryClass::AccessControlCreate => ACCESS_CONTROL_CREATE,
74 EntryClass::AccessControlDelete => ACCESS_CONTROL_DELETE,
75 EntryClass::AccessControlModify => ACCESS_CONTROL_MODIFY,
76 EntryClass::AccessControlProfile => ACCESS_CONTROL_PROFILE,
77 EntryClass::AccessControlReceiverEntryManager => ACCESS_CONTROL_RECEIVER_ENTRY_MANAGER,
78 EntryClass::AccessControlReceiverGroup => ACCESS_CONTROL_RECEIVER_GROUP,
79 EntryClass::AccessControlSearch => ACCESS_CONTROL_SEARCH,
80 EntryClass::AccessControlTargetScope => ACCESS_CONTROL_TARGET_SCOPE,
81 EntryClass::Account => ENTRYCLASS_ACCOUNT,
82 EntryClass::AccountPolicy => ENTRYCLASS_ACCOUNT_POLICY,
83 EntryClass::Application => ENTRYCLASS_APPLICATION,
84 EntryClass::AttributeType => ENTRYCLASS_ATTRIBUTE_TYPE,
85 EntryClass::Builtin => ENTRYCLASS_BUILTIN,
86 EntryClass::Class => ENTRYCLASS_CLASS,
87 EntryClass::ClassType => ENTRYCLASS_CLASS_TYPE,
88 EntryClass::ClientCertificate => ENTRYCLASS_CLIENT_CERTIFICATE,
89 EntryClass::Conflict => ENTRYCLASS_CONFLICT,
90 EntryClass::DomainInfo => ENTRYCLASS_DOMAIN_INFO,
91 EntryClass::DynGroup => ENTRYCLASS_DYN_GROUP,
92 EntryClass::ExtensibleObject => ENTRYCLASS_EXTENSIBLE_OBJECT,
93 EntryClass::Group => ENTRYCLASS_GROUP,
94 EntryClass::KeyProvider => ENTRYCLASS_KEY_PROVIDER,
95 EntryClass::KeyProviderInternal => ENTRYCLASS_KEY_PROVIDER_INTERNAL,
96 EntryClass::KeyObject => ENTRYCLASS_KEY_OBJECT,
97 EntryClass::KeyObjectJwtEs256 => ENTRYCLASS_KEY_OBJECT_JWT_ES256,
98 EntryClass::KeyObjectJwtRs256 => ENTRYCLASS_KEY_OBJECT_JWT_RS256,
99 EntryClass::KeyObjectJweA128GCM => ENTRYCLASS_KEY_OBJECT_JWE_A128GCM,
100 EntryClass::KeyObjectInternal => ENTRYCLASS_KEY_OBJECT_INTERNAL,
101 EntryClass::MemberOf => ENTRYCLASS_MEMBER_OF,
102 EntryClass::OAuth2DeviceCodeSession => OAUTH2_DEVICE_CODE_SESSION,
103 EntryClass::OAuth2ResourceServer => OAUTH2_RESOURCE_SERVER,
104 EntryClass::OAuth2ResourceServerBasic => OAUTH2_RESOURCE_SERVER_BASIC,
105 EntryClass::OAuth2ResourceServerPublic => OAUTH2_RESOURCE_SERVER_PUBLIC,
106 EntryClass::Object => ENTRYCLASS_OBJECT,
107 EntryClass::OrgPerson => ENTRYCLASS_ORG_PERSON,
108 EntryClass::Person => ENTRYCLASS_PERSON,
109 EntryClass::PosixAccount => ENTRYCLASS_POSIX_ACCOUNT,
110 EntryClass::PosixGroup => ENTRYCLASS_POSIX_GROUP,
111 EntryClass::Recycled => ENTRYCLASS_RECYCLED,
112 EntryClass::Service => ENTRYCLASS_SERVICE,
113 EntryClass::ServiceAccount => ENTRYCLASS_SERVICE_ACCOUNT,
114 EntryClass::SyncAccount => ENTRYCLASS_SYNC_ACCOUNT,
115 EntryClass::SyncObject => ENTRYCLASS_SYNC_OBJECT,
116 EntryClass::System => ENTRYCLASS_SYSTEM,
117 EntryClass::SystemConfig => ENTRYCLASS_SYSTEM_CONFIG,
118 EntryClass::SystemInfo => ENTRYCLASS_SYSTEM_INFO,
119 EntryClass::Tombstone => ENTRYCLASS_TOMBSTONE,
120 #[cfg(any(test, debug_assertions))]
121 EntryClass::TestClass => TEST_ENTRYCLASS_TEST_CLASS,
122 EntryClass::User => ENTRYCLASS_USER,
123 }
124 }
125}
126
127impl From<EntryClass> for JsonValue {
128 fn from(value: EntryClass) -> Self {
129 Self::String(value.as_ref().to_string())
130 }
131}
132
133impl AsRef<str> for EntryClass {
134 fn as_ref(&self) -> &str {
135 self.into()
136 }
137}
138
139impl From<&EntryClass> for &'static str {
140 fn from(value: &EntryClass) -> Self {
141 (*value).into()
142 }
143}
144
145impl From<EntryClass> for String {
146 fn from(val: EntryClass) -> Self {
147 let s: &'static str = val.into();
148 s.to_string()
149 }
150}
151
152impl From<EntryClass> for Value {
153 fn from(val: EntryClass) -> Self {
154 Value::new_iutf8(val.into())
155 }
156}
157
158impl From<EntryClass> for PartialValue {
159 fn from(val: EntryClass) -> Self {
160 PartialValue::new_iutf8(val.into())
161 }
162}
163
164impl From<EntryClass> for crate::prelude::AttrString {
165 fn from(val: EntryClass) -> Self {
166 crate::prelude::AttrString::from(val.to_string())
167 }
168}
169
170impl Display for EntryClass {
171 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> std::fmt::Result {
172 let s: String = (*self).into();
173 write!(f, "{}", s)
174 }
175}
176
177impl EntryClass {
178 pub fn to_value(self) -> Value {
179 let s: &'static str = self.into();
180 Value::new_iutf8(s)
181 }
182
183 pub fn to_valueset(self) -> ValueSet {
184 let s: &'static str = self.into();
185 ValueSetIutf8::new(s)
186 }
187
188 pub fn to_partialvalue(self) -> PartialValue {
189 let s: &'static str = self.into();
190 PartialValue::new_iutf8(s)
191 }
192
193 pub fn as_f_eq(&self) -> crate::filter::FC {
195 crate::filter::f_eq(Attribute::Class, self.to_partialvalue())
196 }
197}
198
199#[cfg(test)]
201use crate::entry::{Entry, EntryInit, EntryInitNew, EntryNew};
202
203#[cfg(test)]
204lazy_static! {
205 pub static ref E_TESTPERSON_1: EntryInitNew = entry_init!(
206 (Attribute::Class, EntryClass::Object.to_value()),
207 (Attribute::Class, EntryClass::Account.to_value()),
208 (Attribute::Class, EntryClass::Person.to_value()),
209 (Attribute::Name, Value::new_iname("testperson1")),
210 (Attribute::DisplayName, Value::new_utf8s("Test Person 1")),
211 (
212 Attribute::Uuid,
213 Value::Uuid(super::uuids::UUID_TESTPERSON_1)
214 )
215 );
216 pub static ref E_TESTPERSON_2: EntryInitNew = entry_init!(
217 (Attribute::Class, EntryClass::Object.to_value()),
218 (Attribute::Class, EntryClass::Account.to_value()),
219 (Attribute::Class, EntryClass::Person.to_value()),
220 (Attribute::Name, Value::new_iname("testperson2")),
221 (Attribute::DisplayName, Value::new_utf8s("Test Person 2")),
222 (
223 Attribute::Uuid,
224 Value::Uuid(super::uuids::UUID_TESTPERSON_2)
225 )
226 );
227}