1pub mod add_member;
9pub mod delete_member;
10pub mod list_members;
11pub mod update_member;
12
13
14#[allow(unused_imports)]
15use alloc::collections::BTreeMap;
16
17#[allow(unused_imports)]
18use core::marker::PhantomData;
19use jacquard_common::CowStr;
20
21#[allow(unused_imports)]
22use jacquard_common::deps::codegen::unicode_segmentation::UnicodeSegmentation;
23use jacquard_common::types::string::{Did, Datetime};
24use jacquard_derive::{IntoStatic, lexicon};
25use jacquard_lexicon::lexicon::LexiconDoc;
26use jacquard_lexicon::schema::LexiconSchema;
27
28#[allow(unused_imports)]
29use jacquard_lexicon::validation::{ConstraintError, ValidationPath};
30use serde::{Serialize, Deserialize};
31use crate::app_bsky::actor::ProfileViewDetailed;
32
33#[lexicon]
34#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, IntoStatic)]
35#[serde(rename_all = "camelCase")]
36pub struct Member<'a> {
37 #[serde(skip_serializing_if = "Option::is_none")]
38 pub created_at: Option<Datetime>,
39 #[serde(borrow)]
40 pub did: Did<'a>,
41 #[serde(skip_serializing_if = "Option::is_none")]
42 pub disabled: Option<bool>,
43 #[serde(skip_serializing_if = "Option::is_none")]
44 #[serde(borrow)]
45 pub last_updated_by: Option<CowStr<'a>>,
46 #[serde(skip_serializing_if = "Option::is_none")]
47 #[serde(borrow)]
48 pub profile: Option<ProfileViewDetailed<'a>>,
49 #[serde(borrow)]
50 pub role: MemberRole<'a>,
51 #[serde(skip_serializing_if = "Option::is_none")]
52 pub updated_at: Option<Datetime>,
53}
54
55
56#[derive(Debug, Clone, PartialEq, Eq, Hash)]
57pub enum MemberRole<'a> {
58 RoleAdmin,
59 RoleModerator,
60 RoleTriage,
61 RoleVerifier,
62 Other(CowStr<'a>),
63}
64
65impl<'a> MemberRole<'a> {
66 pub fn as_str(&self) -> &str {
67 match self {
68 Self::RoleAdmin => "tools.ozone.team.defs#roleAdmin",
69 Self::RoleModerator => "tools.ozone.team.defs#roleModerator",
70 Self::RoleTriage => "tools.ozone.team.defs#roleTriage",
71 Self::RoleVerifier => "tools.ozone.team.defs#roleVerifier",
72 Self::Other(s) => s.as_ref(),
73 }
74 }
75}
76
77impl<'a> From<&'a str> for MemberRole<'a> {
78 fn from(s: &'a str) -> Self {
79 match s {
80 "tools.ozone.team.defs#roleAdmin" => Self::RoleAdmin,
81 "tools.ozone.team.defs#roleModerator" => Self::RoleModerator,
82 "tools.ozone.team.defs#roleTriage" => Self::RoleTriage,
83 "tools.ozone.team.defs#roleVerifier" => Self::RoleVerifier,
84 _ => Self::Other(CowStr::from(s)),
85 }
86 }
87}
88
89impl<'a> From<String> for MemberRole<'a> {
90 fn from(s: String) -> Self {
91 match s.as_str() {
92 "tools.ozone.team.defs#roleAdmin" => Self::RoleAdmin,
93 "tools.ozone.team.defs#roleModerator" => Self::RoleModerator,
94 "tools.ozone.team.defs#roleTriage" => Self::RoleTriage,
95 "tools.ozone.team.defs#roleVerifier" => Self::RoleVerifier,
96 _ => Self::Other(CowStr::from(s)),
97 }
98 }
99}
100
101impl<'a> core::fmt::Display for MemberRole<'a> {
102 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
103 write!(f, "{}", self.as_str())
104 }
105}
106
107impl<'a> AsRef<str> for MemberRole<'a> {
108 fn as_ref(&self) -> &str {
109 self.as_str()
110 }
111}
112
113impl<'a> serde::Serialize for MemberRole<'a> {
114 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
115 where
116 S: serde::Serializer,
117 {
118 serializer.serialize_str(self.as_str())
119 }
120}
121
122impl<'de, 'a> serde::Deserialize<'de> for MemberRole<'a>
123where
124 'de: 'a,
125{
126 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
127 where
128 D: serde::Deserializer<'de>,
129 {
130 let s = <&'de str>::deserialize(deserializer)?;
131 Ok(Self::from(s))
132 }
133}
134
135impl<'a> Default for MemberRole<'a> {
136 fn default() -> Self {
137 Self::Other(Default::default())
138 }
139}
140
141impl jacquard_common::IntoStatic for MemberRole<'_> {
142 type Output = MemberRole<'static>;
143 fn into_static(self) -> Self::Output {
144 match self {
145 MemberRole::RoleAdmin => MemberRole::RoleAdmin,
146 MemberRole::RoleModerator => MemberRole::RoleModerator,
147 MemberRole::RoleTriage => MemberRole::RoleTriage,
148 MemberRole::RoleVerifier => MemberRole::RoleVerifier,
149 MemberRole::Other(v) => MemberRole::Other(v.into_static()),
150 }
151 }
152}
153
154#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, IntoStatic, Hash)]
157pub struct RoleAdmin;
158impl core::fmt::Display for RoleAdmin {
159 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
160 write!(f, "roleAdmin")
161 }
162}
163
164#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, IntoStatic, Hash)]
167pub struct RoleModerator;
168impl core::fmt::Display for RoleModerator {
169 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
170 write!(f, "roleModerator")
171 }
172}
173
174#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, IntoStatic, Hash)]
177pub struct RoleTriage;
178impl core::fmt::Display for RoleTriage {
179 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
180 write!(f, "roleTriage")
181 }
182}
183
184#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, IntoStatic, Hash)]
187pub struct RoleVerifier;
188impl core::fmt::Display for RoleVerifier {
189 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
190 write!(f, "roleVerifier")
191 }
192}
193
194impl<'a> LexiconSchema for Member<'a> {
195 fn nsid() -> &'static str {
196 "tools.ozone.team.defs"
197 }
198 fn def_name() -> &'static str {
199 "member"
200 }
201 fn lexicon_doc() -> LexiconDoc<'static> {
202 lexicon_doc_tools_ozone_team_defs()
203 }
204 fn validate(&self) -> Result<(), ConstraintError> {
205 Ok(())
206 }
207}
208
209pub mod member_state {
210
211 pub use crate::builder_types::{Set, Unset, IsSet, IsUnset};
212 #[allow(unused)]
213 use ::core::marker::PhantomData;
214 mod sealed {
215 pub trait Sealed {}
216 }
217 pub trait State: sealed::Sealed {
219 type Role;
220 type Did;
221 }
222 pub struct Empty(());
224 impl sealed::Sealed for Empty {}
225 impl State for Empty {
226 type Role = Unset;
227 type Did = Unset;
228 }
229 pub struct SetRole<S: State = Empty>(PhantomData<fn() -> S>);
231 impl<S: State> sealed::Sealed for SetRole<S> {}
232 impl<S: State> State for SetRole<S> {
233 type Role = Set<members::role>;
234 type Did = S::Did;
235 }
236 pub struct SetDid<S: State = Empty>(PhantomData<fn() -> S>);
238 impl<S: State> sealed::Sealed for SetDid<S> {}
239 impl<S: State> State for SetDid<S> {
240 type Role = S::Role;
241 type Did = Set<members::did>;
242 }
243 #[allow(non_camel_case_types)]
245 pub mod members {
246 pub struct role(());
248 pub struct did(());
250 }
251}
252
253pub struct MemberBuilder<'a, S: member_state::State> {
255 _state: PhantomData<fn() -> S>,
256 _fields: (
257 Option<Datetime>,
258 Option<Did<'a>>,
259 Option<bool>,
260 Option<CowStr<'a>>,
261 Option<ProfileViewDetailed<'a>>,
262 Option<MemberRole<'a>>,
263 Option<Datetime>,
264 ),
265 _lifetime: PhantomData<&'a ()>,
266}
267
268impl<'a> Member<'a> {
269 pub fn new() -> MemberBuilder<'a, member_state::Empty> {
271 MemberBuilder::new()
272 }
273}
274
275impl<'a> MemberBuilder<'a, member_state::Empty> {
276 pub fn new() -> Self {
278 MemberBuilder {
279 _state: PhantomData,
280 _fields: (None, None, None, None, None, None, None),
281 _lifetime: PhantomData,
282 }
283 }
284}
285
286impl<'a, S: member_state::State> MemberBuilder<'a, S> {
287 pub fn created_at(mut self, value: impl Into<Option<Datetime>>) -> Self {
289 self._fields.0 = value.into();
290 self
291 }
292 pub fn maybe_created_at(mut self, value: Option<Datetime>) -> Self {
294 self._fields.0 = value;
295 self
296 }
297}
298
299impl<'a, S> MemberBuilder<'a, S>
300where
301 S: member_state::State,
302 S::Did: member_state::IsUnset,
303{
304 pub fn did(
306 mut self,
307 value: impl Into<Did<'a>>,
308 ) -> MemberBuilder<'a, member_state::SetDid<S>> {
309 self._fields.1 = Option::Some(value.into());
310 MemberBuilder {
311 _state: PhantomData,
312 _fields: self._fields,
313 _lifetime: PhantomData,
314 }
315 }
316}
317
318impl<'a, S: member_state::State> MemberBuilder<'a, S> {
319 pub fn disabled(mut self, value: impl Into<Option<bool>>) -> Self {
321 self._fields.2 = value.into();
322 self
323 }
324 pub fn maybe_disabled(mut self, value: Option<bool>) -> Self {
326 self._fields.2 = value;
327 self
328 }
329}
330
331impl<'a, S: member_state::State> MemberBuilder<'a, S> {
332 pub fn last_updated_by(mut self, value: impl Into<Option<CowStr<'a>>>) -> Self {
334 self._fields.3 = value.into();
335 self
336 }
337 pub fn maybe_last_updated_by(mut self, value: Option<CowStr<'a>>) -> Self {
339 self._fields.3 = value;
340 self
341 }
342}
343
344impl<'a, S: member_state::State> MemberBuilder<'a, S> {
345 pub fn profile(mut self, value: impl Into<Option<ProfileViewDetailed<'a>>>) -> Self {
347 self._fields.4 = value.into();
348 self
349 }
350 pub fn maybe_profile(mut self, value: Option<ProfileViewDetailed<'a>>) -> Self {
352 self._fields.4 = value;
353 self
354 }
355}
356
357impl<'a, S> MemberBuilder<'a, S>
358where
359 S: member_state::State,
360 S::Role: member_state::IsUnset,
361{
362 pub fn role(
364 mut self,
365 value: impl Into<MemberRole<'a>>,
366 ) -> MemberBuilder<'a, member_state::SetRole<S>> {
367 self._fields.5 = Option::Some(value.into());
368 MemberBuilder {
369 _state: PhantomData,
370 _fields: self._fields,
371 _lifetime: PhantomData,
372 }
373 }
374}
375
376impl<'a, S: member_state::State> MemberBuilder<'a, S> {
377 pub fn updated_at(mut self, value: impl Into<Option<Datetime>>) -> Self {
379 self._fields.6 = value.into();
380 self
381 }
382 pub fn maybe_updated_at(mut self, value: Option<Datetime>) -> Self {
384 self._fields.6 = value;
385 self
386 }
387}
388
389impl<'a, S> MemberBuilder<'a, S>
390where
391 S: member_state::State,
392 S::Role: member_state::IsSet,
393 S::Did: member_state::IsSet,
394{
395 pub fn build(self) -> Member<'a> {
397 Member {
398 created_at: self._fields.0,
399 did: self._fields.1.unwrap(),
400 disabled: self._fields.2,
401 last_updated_by: self._fields.3,
402 profile: self._fields.4,
403 role: self._fields.5.unwrap(),
404 updated_at: self._fields.6,
405 extra_data: Default::default(),
406 }
407 }
408 pub fn build_with_data(
410 self,
411 extra_data: BTreeMap<
412 jacquard_common::deps::smol_str::SmolStr,
413 jacquard_common::types::value::Data<'a>,
414 >,
415 ) -> Member<'a> {
416 Member {
417 created_at: self._fields.0,
418 did: self._fields.1.unwrap(),
419 disabled: self._fields.2,
420 last_updated_by: self._fields.3,
421 profile: self._fields.4,
422 role: self._fields.5.unwrap(),
423 updated_at: self._fields.6,
424 extra_data: Some(extra_data),
425 }
426 }
427}
428
429fn lexicon_doc_tools_ozone_team_defs() -> LexiconDoc<'static> {
430 #[allow(unused_imports)]
431 use jacquard_common::{CowStr, deps::smol_str::SmolStr, types::blob::MimeType};
432 use jacquard_lexicon::lexicon::*;
433 use alloc::collections::BTreeMap;
434 LexiconDoc {
435 lexicon: Lexicon::Lexicon1,
436 id: CowStr::new_static("tools.ozone.team.defs"),
437 defs: {
438 let mut map = BTreeMap::new();
439 map.insert(
440 SmolStr::new_static("member"),
441 LexUserType::Object(LexObject {
442 required: Some(
443 vec![SmolStr::new_static("did"), SmolStr::new_static("role")],
444 ),
445 properties: {
446 #[allow(unused_mut)]
447 let mut map = BTreeMap::new();
448 map.insert(
449 SmolStr::new_static("createdAt"),
450 LexObjectProperty::String(LexString {
451 format: Some(LexStringFormat::Datetime),
452 ..Default::default()
453 }),
454 );
455 map.insert(
456 SmolStr::new_static("did"),
457 LexObjectProperty::String(LexString {
458 format: Some(LexStringFormat::Did),
459 ..Default::default()
460 }),
461 );
462 map.insert(
463 SmolStr::new_static("disabled"),
464 LexObjectProperty::Boolean(LexBoolean {
465 ..Default::default()
466 }),
467 );
468 map.insert(
469 SmolStr::new_static("lastUpdatedBy"),
470 LexObjectProperty::String(LexString { ..Default::default() }),
471 );
472 map.insert(
473 SmolStr::new_static("profile"),
474 LexObjectProperty::Ref(LexRef {
475 r#ref: CowStr::new_static(
476 "app.bsky.actor.defs#profileViewDetailed",
477 ),
478 ..Default::default()
479 }),
480 );
481 map.insert(
482 SmolStr::new_static("role"),
483 LexObjectProperty::String(LexString { ..Default::default() }),
484 );
485 map.insert(
486 SmolStr::new_static("updatedAt"),
487 LexObjectProperty::String(LexString {
488 format: Some(LexStringFormat::Datetime),
489 ..Default::default()
490 }),
491 );
492 map
493 },
494 ..Default::default()
495 }),
496 );
497 map.insert(
498 SmolStr::new_static("roleAdmin"),
499 LexUserType::Token(LexToken { ..Default::default() }),
500 );
501 map.insert(
502 SmolStr::new_static("roleModerator"),
503 LexUserType::Token(LexToken { ..Default::default() }),
504 );
505 map.insert(
506 SmolStr::new_static("roleTriage"),
507 LexUserType::Token(LexToken { ..Default::default() }),
508 );
509 map.insert(
510 SmolStr::new_static("roleVerifier"),
511 LexUserType::Token(LexToken { ..Default::default() }),
512 );
513 map
514 },
515 ..Default::default()
516 }
517}