1#[jacquard_derive::lexicon]
10#[derive(
11 serde::Serialize,
12 serde::Deserialize,
13 Debug,
14 Clone,
15 PartialEq,
16 Eq,
17 jacquard_derive::IntoStatic
18)]
19#[serde(rename_all = "camelCase")]
20pub struct Message<'a> {
21 pub created_at: jacquard_common::types::string::Datetime,
23 #[serde(skip_serializing_if = "std::option::Option::is_none")]
25 #[serde(borrow)]
26 pub facets: Option<Vec<crate::place_stream::richtext::facet::Facet<'a>>>,
27 #[serde(skip_serializing_if = "std::option::Option::is_none")]
28 #[serde(borrow)]
29 pub reply: Option<crate::place_stream::chat::message::ReplyRef<'a>>,
30 #[serde(borrow)]
32 pub streamer: jacquard_common::types::string::Did<'a>,
33 #[serde(borrow)]
35 pub text: jacquard_common::CowStr<'a>,
36}
37
38pub mod message_state {
39
40 pub use crate::builder_types::{Set, Unset, IsSet, IsUnset};
41 #[allow(unused)]
42 use ::core::marker::PhantomData;
43 mod sealed {
44 pub trait Sealed {}
45 }
46 pub trait State: sealed::Sealed {
48 type Text;
49 type CreatedAt;
50 type Streamer;
51 }
52 pub struct Empty(());
54 impl sealed::Sealed for Empty {}
55 impl State for Empty {
56 type Text = Unset;
57 type CreatedAt = Unset;
58 type Streamer = Unset;
59 }
60 pub struct SetText<S: State = Empty>(PhantomData<fn() -> S>);
62 impl<S: State> sealed::Sealed for SetText<S> {}
63 impl<S: State> State for SetText<S> {
64 type Text = Set<members::text>;
65 type CreatedAt = S::CreatedAt;
66 type Streamer = S::Streamer;
67 }
68 pub struct SetCreatedAt<S: State = Empty>(PhantomData<fn() -> S>);
70 impl<S: State> sealed::Sealed for SetCreatedAt<S> {}
71 impl<S: State> State for SetCreatedAt<S> {
72 type Text = S::Text;
73 type CreatedAt = Set<members::created_at>;
74 type Streamer = S::Streamer;
75 }
76 pub struct SetStreamer<S: State = Empty>(PhantomData<fn() -> S>);
78 impl<S: State> sealed::Sealed for SetStreamer<S> {}
79 impl<S: State> State for SetStreamer<S> {
80 type Text = S::Text;
81 type CreatedAt = S::CreatedAt;
82 type Streamer = Set<members::streamer>;
83 }
84 #[allow(non_camel_case_types)]
86 pub mod members {
87 pub struct text(());
89 pub struct created_at(());
91 pub struct streamer(());
93 }
94}
95
96pub struct MessageBuilder<'a, S: message_state::State> {
98 _phantom_state: ::core::marker::PhantomData<fn() -> S>,
99 __unsafe_private_named: (
100 ::core::option::Option<jacquard_common::types::string::Datetime>,
101 ::core::option::Option<Vec<crate::place_stream::richtext::facet::Facet<'a>>>,
102 ::core::option::Option<crate::place_stream::chat::message::ReplyRef<'a>>,
103 ::core::option::Option<jacquard_common::types::string::Did<'a>>,
104 ::core::option::Option<jacquard_common::CowStr<'a>>,
105 ),
106 _phantom: ::core::marker::PhantomData<&'a ()>,
107}
108
109impl<'a> Message<'a> {
110 pub fn new() -> MessageBuilder<'a, message_state::Empty> {
112 MessageBuilder::new()
113 }
114}
115
116impl<'a> MessageBuilder<'a, message_state::Empty> {
117 pub fn new() -> Self {
119 MessageBuilder {
120 _phantom_state: ::core::marker::PhantomData,
121 __unsafe_private_named: (None, None, None, None, None),
122 _phantom: ::core::marker::PhantomData,
123 }
124 }
125}
126
127impl<'a, S> MessageBuilder<'a, S>
128where
129 S: message_state::State,
130 S::CreatedAt: message_state::IsUnset,
131{
132 pub fn created_at(
134 mut self,
135 value: impl Into<jacquard_common::types::string::Datetime>,
136 ) -> MessageBuilder<'a, message_state::SetCreatedAt<S>> {
137 self.__unsafe_private_named.0 = ::core::option::Option::Some(value.into());
138 MessageBuilder {
139 _phantom_state: ::core::marker::PhantomData,
140 __unsafe_private_named: self.__unsafe_private_named,
141 _phantom: ::core::marker::PhantomData,
142 }
143 }
144}
145
146impl<'a, S: message_state::State> MessageBuilder<'a, S> {
147 pub fn facets(
149 mut self,
150 value: impl Into<Option<Vec<crate::place_stream::richtext::facet::Facet<'a>>>>,
151 ) -> Self {
152 self.__unsafe_private_named.1 = value.into();
153 self
154 }
155 pub fn maybe_facets(
157 mut self,
158 value: Option<Vec<crate::place_stream::richtext::facet::Facet<'a>>>,
159 ) -> Self {
160 self.__unsafe_private_named.1 = value;
161 self
162 }
163}
164
165impl<'a, S: message_state::State> MessageBuilder<'a, S> {
166 pub fn reply(
168 mut self,
169 value: impl Into<Option<crate::place_stream::chat::message::ReplyRef<'a>>>,
170 ) -> Self {
171 self.__unsafe_private_named.2 = value.into();
172 self
173 }
174 pub fn maybe_reply(
176 mut self,
177 value: Option<crate::place_stream::chat::message::ReplyRef<'a>>,
178 ) -> Self {
179 self.__unsafe_private_named.2 = value;
180 self
181 }
182}
183
184impl<'a, S> MessageBuilder<'a, S>
185where
186 S: message_state::State,
187 S::Streamer: message_state::IsUnset,
188{
189 pub fn streamer(
191 mut self,
192 value: impl Into<jacquard_common::types::string::Did<'a>>,
193 ) -> MessageBuilder<'a, message_state::SetStreamer<S>> {
194 self.__unsafe_private_named.3 = ::core::option::Option::Some(value.into());
195 MessageBuilder {
196 _phantom_state: ::core::marker::PhantomData,
197 __unsafe_private_named: self.__unsafe_private_named,
198 _phantom: ::core::marker::PhantomData,
199 }
200 }
201}
202
203impl<'a, S> MessageBuilder<'a, S>
204where
205 S: message_state::State,
206 S::Text: message_state::IsUnset,
207{
208 pub fn text(
210 mut self,
211 value: impl Into<jacquard_common::CowStr<'a>>,
212 ) -> MessageBuilder<'a, message_state::SetText<S>> {
213 self.__unsafe_private_named.4 = ::core::option::Option::Some(value.into());
214 MessageBuilder {
215 _phantom_state: ::core::marker::PhantomData,
216 __unsafe_private_named: self.__unsafe_private_named,
217 _phantom: ::core::marker::PhantomData,
218 }
219 }
220}
221
222impl<'a, S> MessageBuilder<'a, S>
223where
224 S: message_state::State,
225 S::Text: message_state::IsSet,
226 S::CreatedAt: message_state::IsSet,
227 S::Streamer: message_state::IsSet,
228{
229 pub fn build(self) -> Message<'a> {
231 Message {
232 created_at: self.__unsafe_private_named.0.unwrap(),
233 facets: self.__unsafe_private_named.1,
234 reply: self.__unsafe_private_named.2,
235 streamer: self.__unsafe_private_named.3.unwrap(),
236 text: self.__unsafe_private_named.4.unwrap(),
237 extra_data: Default::default(),
238 }
239 }
240 pub fn build_with_data(
242 self,
243 extra_data: std::collections::BTreeMap<
244 jacquard_common::smol_str::SmolStr,
245 jacquard_common::types::value::Data<'a>,
246 >,
247 ) -> Message<'a> {
248 Message {
249 created_at: self.__unsafe_private_named.0.unwrap(),
250 facets: self.__unsafe_private_named.1,
251 reply: self.__unsafe_private_named.2,
252 streamer: self.__unsafe_private_named.3.unwrap(),
253 text: self.__unsafe_private_named.4.unwrap(),
254 extra_data: Some(extra_data),
255 }
256 }
257}
258
259impl<'a> Message<'a> {
260 pub fn uri(
261 uri: impl Into<jacquard_common::CowStr<'a>>,
262 ) -> Result<
263 jacquard_common::types::uri::RecordUri<'a, MessageRecord>,
264 jacquard_common::types::uri::UriError,
265 > {
266 jacquard_common::types::uri::RecordUri::try_from_uri(
267 jacquard_common::types::string::AtUri::new_cow(uri.into())?,
268 )
269 }
270}
271
272#[derive(
274 serde::Serialize,
275 serde::Deserialize,
276 Debug,
277 Clone,
278 PartialEq,
279 Eq,
280 jacquard_derive::IntoStatic
281)]
282#[serde(rename_all = "camelCase")]
283pub struct MessageGetRecordOutput<'a> {
284 #[serde(skip_serializing_if = "std::option::Option::is_none")]
285 #[serde(borrow)]
286 pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>,
287 #[serde(borrow)]
288 pub uri: jacquard_common::types::string::AtUri<'a>,
289 #[serde(borrow)]
290 pub value: Message<'a>,
291}
292
293impl From<MessageGetRecordOutput<'_>> for Message<'_> {
294 fn from(output: MessageGetRecordOutput<'_>) -> Self {
295 use jacquard_common::IntoStatic;
296 output.value.into_static()
297 }
298}
299
300impl jacquard_common::types::collection::Collection for Message<'_> {
301 const NSID: &'static str = "place.stream.chat.message";
302 type Record = MessageRecord;
303}
304
305#[derive(Debug, serde::Serialize, serde::Deserialize)]
307pub struct MessageRecord;
308impl jacquard_common::xrpc::XrpcResp for MessageRecord {
309 const NSID: &'static str = "place.stream.chat.message";
310 const ENCODING: &'static str = "application/json";
311 type Output<'de> = MessageGetRecordOutput<'de>;
312 type Err<'de> = jacquard_common::types::collection::RecordError<'de>;
313}
314
315impl jacquard_common::types::collection::Collection for MessageRecord {
316 const NSID: &'static str = "place.stream.chat.message";
317 type Record = MessageRecord;
318}
319
320impl<'a> ::jacquard_lexicon::schema::LexiconSchema for Message<'a> {
321 fn nsid() -> &'static str {
322 "place.stream.chat.message"
323 }
324 fn def_name() -> &'static str {
325 "main"
326 }
327 fn lexicon_doc() -> ::jacquard_lexicon::lexicon::LexiconDoc<'static> {
328 lexicon_doc_place_stream_chat_message()
329 }
330 fn validate(
331 &self,
332 ) -> ::std::result::Result<(), ::jacquard_lexicon::validation::ConstraintError> {
333 {
334 let value = &self.text;
335 #[allow(unused_comparisons)]
336 if <str>::len(value.as_ref()) > 3000usize {
337 return Err(::jacquard_lexicon::validation::ConstraintError::MaxLength {
338 path: ::jacquard_lexicon::validation::ValidationPath::from_field(
339 "text",
340 ),
341 max: 3000usize,
342 actual: <str>::len(value.as_ref()),
343 });
344 }
345 }
346 {
347 let value = &self.text;
348 {
349 let count = ::unicode_segmentation::UnicodeSegmentation::graphemes(
350 value.as_ref(),
351 true,
352 )
353 .count();
354 if count > 300usize {
355 return Err(::jacquard_lexicon::validation::ConstraintError::MaxGraphemes {
356 path: ::jacquard_lexicon::validation::ValidationPath::from_field(
357 "text",
358 ),
359 max: 300usize,
360 actual: count,
361 });
362 }
363 }
364 }
365 Ok(())
366 }
367}
368
369fn lexicon_doc_place_stream_chat_message() -> ::jacquard_lexicon::lexicon::LexiconDoc<
370 'static,
371> {
372 ::jacquard_lexicon::lexicon::LexiconDoc {
373 lexicon: ::jacquard_lexicon::lexicon::Lexicon::Lexicon1,
374 id: ::jacquard_common::CowStr::new_static("place.stream.chat.message"),
375 revision: None,
376 description: None,
377 defs: {
378 let mut map = ::std::collections::BTreeMap::new();
379 map.insert(
380 ::jacquard_common::smol_str::SmolStr::new_static("main"),
381 ::jacquard_lexicon::lexicon::LexUserType::Record(::jacquard_lexicon::lexicon::LexRecord {
382 description: Some(
383 ::jacquard_common::CowStr::new_static(
384 "Record containing a Streamplace chat message.",
385 ),
386 ),
387 key: Some(::jacquard_common::CowStr::new_static("tid")),
388 record: ::jacquard_lexicon::lexicon::LexRecordRecord::Object(::jacquard_lexicon::lexicon::LexObject {
389 description: None,
390 required: Some(
391 vec![
392 ::jacquard_common::smol_str::SmolStr::new_static("text"),
393 ::jacquard_common::smol_str::SmolStr::new_static("createdAt"),
394 ::jacquard_common::smol_str::SmolStr::new_static("streamer")
395 ],
396 ),
397 nullable: None,
398 properties: {
399 #[allow(unused_mut)]
400 let mut map = ::std::collections::BTreeMap::new();
401 map.insert(
402 ::jacquard_common::smol_str::SmolStr::new_static(
403 "createdAt",
404 ),
405 ::jacquard_lexicon::lexicon::LexObjectProperty::String(::jacquard_lexicon::lexicon::LexString {
406 description: Some(
407 ::jacquard_common::CowStr::new_static(
408 "Client-declared timestamp when this message was originally created.",
409 ),
410 ),
411 format: Some(
412 ::jacquard_lexicon::lexicon::LexStringFormat::Datetime,
413 ),
414 default: None,
415 min_length: None,
416 max_length: None,
417 min_graphemes: None,
418 max_graphemes: None,
419 r#enum: None,
420 r#const: None,
421 known_values: None,
422 }),
423 );
424 map.insert(
425 ::jacquard_common::smol_str::SmolStr::new_static("facets"),
426 ::jacquard_lexicon::lexicon::LexObjectProperty::Array(::jacquard_lexicon::lexicon::LexArray {
427 description: Some(
428 ::jacquard_common::CowStr::new_static(
429 "Annotations of text (mentions, URLs, etc)",
430 ),
431 ),
432 items: ::jacquard_lexicon::lexicon::LexArrayItem::Ref(::jacquard_lexicon::lexicon::LexRef {
433 description: None,
434 r#ref: ::jacquard_common::CowStr::new_static(
435 "place.stream.richtext.facet",
436 ),
437 }),
438 min_length: None,
439 max_length: None,
440 }),
441 );
442 map.insert(
443 ::jacquard_common::smol_str::SmolStr::new_static("reply"),
444 ::jacquard_lexicon::lexicon::LexObjectProperty::Ref(::jacquard_lexicon::lexicon::LexRef {
445 description: None,
446 r#ref: ::jacquard_common::CowStr::new_static("#replyRef"),
447 }),
448 );
449 map.insert(
450 ::jacquard_common::smol_str::SmolStr::new_static(
451 "streamer",
452 ),
453 ::jacquard_lexicon::lexicon::LexObjectProperty::String(::jacquard_lexicon::lexicon::LexString {
454 description: Some(
455 ::jacquard_common::CowStr::new_static(
456 "The DID of the streamer whose chat this is.",
457 ),
458 ),
459 format: Some(
460 ::jacquard_lexicon::lexicon::LexStringFormat::Did,
461 ),
462 default: None,
463 min_length: None,
464 max_length: None,
465 min_graphemes: None,
466 max_graphemes: None,
467 r#enum: None,
468 r#const: None,
469 known_values: None,
470 }),
471 );
472 map.insert(
473 ::jacquard_common::smol_str::SmolStr::new_static("text"),
474 ::jacquard_lexicon::lexicon::LexObjectProperty::String(::jacquard_lexicon::lexicon::LexString {
475 description: Some(
476 ::jacquard_common::CowStr::new_static(
477 "The primary message content. May be an empty string, if there are embeds.",
478 ),
479 ),
480 format: None,
481 default: None,
482 min_length: None,
483 max_length: Some(3000usize),
484 min_graphemes: None,
485 max_graphemes: Some(300usize),
486 r#enum: None,
487 r#const: None,
488 known_values: None,
489 }),
490 );
491 map
492 },
493 }),
494 }),
495 );
496 map.insert(
497 ::jacquard_common::smol_str::SmolStr::new_static("replyRef"),
498 ::jacquard_lexicon::lexicon::LexUserType::Object(::jacquard_lexicon::lexicon::LexObject {
499 description: None,
500 required: Some(
501 vec![
502 ::jacquard_common::smol_str::SmolStr::new_static("root"),
503 ::jacquard_common::smol_str::SmolStr::new_static("parent")
504 ],
505 ),
506 nullable: None,
507 properties: {
508 #[allow(unused_mut)]
509 let mut map = ::std::collections::BTreeMap::new();
510 map.insert(
511 ::jacquard_common::smol_str::SmolStr::new_static("parent"),
512 ::jacquard_lexicon::lexicon::LexObjectProperty::Ref(::jacquard_lexicon::lexicon::LexRef {
513 description: None,
514 r#ref: ::jacquard_common::CowStr::new_static(
515 "com.atproto.repo.strongRef",
516 ),
517 }),
518 );
519 map.insert(
520 ::jacquard_common::smol_str::SmolStr::new_static("root"),
521 ::jacquard_lexicon::lexicon::LexObjectProperty::Ref(::jacquard_lexicon::lexicon::LexRef {
522 description: None,
523 r#ref: ::jacquard_common::CowStr::new_static(
524 "com.atproto.repo.strongRef",
525 ),
526 }),
527 );
528 map
529 },
530 }),
531 );
532 map
533 },
534 }
535}
536
537#[jacquard_derive::lexicon]
538#[derive(
539 serde::Serialize,
540 serde::Deserialize,
541 Debug,
542 Clone,
543 PartialEq,
544 Eq,
545 jacquard_derive::IntoStatic
546)]
547#[serde(rename_all = "camelCase")]
548pub struct ReplyRef<'a> {
549 #[serde(borrow)]
550 pub parent: crate::com_atproto::repo::strong_ref::StrongRef<'a>,
551 #[serde(borrow)]
552 pub root: crate::com_atproto::repo::strong_ref::StrongRef<'a>,
553}
554
555pub mod reply_ref_state {
556
557 pub use crate::builder_types::{Set, Unset, IsSet, IsUnset};
558 #[allow(unused)]
559 use ::core::marker::PhantomData;
560 mod sealed {
561 pub trait Sealed {}
562 }
563 pub trait State: sealed::Sealed {
565 type Root;
566 type Parent;
567 }
568 pub struct Empty(());
570 impl sealed::Sealed for Empty {}
571 impl State for Empty {
572 type Root = Unset;
573 type Parent = Unset;
574 }
575 pub struct SetRoot<S: State = Empty>(PhantomData<fn() -> S>);
577 impl<S: State> sealed::Sealed for SetRoot<S> {}
578 impl<S: State> State for SetRoot<S> {
579 type Root = Set<members::root>;
580 type Parent = S::Parent;
581 }
582 pub struct SetParent<S: State = Empty>(PhantomData<fn() -> S>);
584 impl<S: State> sealed::Sealed for SetParent<S> {}
585 impl<S: State> State for SetParent<S> {
586 type Root = S::Root;
587 type Parent = Set<members::parent>;
588 }
589 #[allow(non_camel_case_types)]
591 pub mod members {
592 pub struct root(());
594 pub struct parent(());
596 }
597}
598
599pub struct ReplyRefBuilder<'a, S: reply_ref_state::State> {
601 _phantom_state: ::core::marker::PhantomData<fn() -> S>,
602 __unsafe_private_named: (
603 ::core::option::Option<crate::com_atproto::repo::strong_ref::StrongRef<'a>>,
604 ::core::option::Option<crate::com_atproto::repo::strong_ref::StrongRef<'a>>,
605 ),
606 _phantom: ::core::marker::PhantomData<&'a ()>,
607}
608
609impl<'a> ReplyRef<'a> {
610 pub fn new() -> ReplyRefBuilder<'a, reply_ref_state::Empty> {
612 ReplyRefBuilder::new()
613 }
614}
615
616impl<'a> ReplyRefBuilder<'a, reply_ref_state::Empty> {
617 pub fn new() -> Self {
619 ReplyRefBuilder {
620 _phantom_state: ::core::marker::PhantomData,
621 __unsafe_private_named: (None, None),
622 _phantom: ::core::marker::PhantomData,
623 }
624 }
625}
626
627impl<'a, S> ReplyRefBuilder<'a, S>
628where
629 S: reply_ref_state::State,
630 S::Parent: reply_ref_state::IsUnset,
631{
632 pub fn parent(
634 mut self,
635 value: impl Into<crate::com_atproto::repo::strong_ref::StrongRef<'a>>,
636 ) -> ReplyRefBuilder<'a, reply_ref_state::SetParent<S>> {
637 self.__unsafe_private_named.0 = ::core::option::Option::Some(value.into());
638 ReplyRefBuilder {
639 _phantom_state: ::core::marker::PhantomData,
640 __unsafe_private_named: self.__unsafe_private_named,
641 _phantom: ::core::marker::PhantomData,
642 }
643 }
644}
645
646impl<'a, S> ReplyRefBuilder<'a, S>
647where
648 S: reply_ref_state::State,
649 S::Root: reply_ref_state::IsUnset,
650{
651 pub fn root(
653 mut self,
654 value: impl Into<crate::com_atproto::repo::strong_ref::StrongRef<'a>>,
655 ) -> ReplyRefBuilder<'a, reply_ref_state::SetRoot<S>> {
656 self.__unsafe_private_named.1 = ::core::option::Option::Some(value.into());
657 ReplyRefBuilder {
658 _phantom_state: ::core::marker::PhantomData,
659 __unsafe_private_named: self.__unsafe_private_named,
660 _phantom: ::core::marker::PhantomData,
661 }
662 }
663}
664
665impl<'a, S> ReplyRefBuilder<'a, S>
666where
667 S: reply_ref_state::State,
668 S::Root: reply_ref_state::IsSet,
669 S::Parent: reply_ref_state::IsSet,
670{
671 pub fn build(self) -> ReplyRef<'a> {
673 ReplyRef {
674 parent: self.__unsafe_private_named.0.unwrap(),
675 root: self.__unsafe_private_named.1.unwrap(),
676 extra_data: Default::default(),
677 }
678 }
679 pub fn build_with_data(
681 self,
682 extra_data: std::collections::BTreeMap<
683 jacquard_common::smol_str::SmolStr,
684 jacquard_common::types::value::Data<'a>,
685 >,
686 ) -> ReplyRef<'a> {
687 ReplyRef {
688 parent: self.__unsafe_private_named.0.unwrap(),
689 root: self.__unsafe_private_named.1.unwrap(),
690 extra_data: Some(extra_data),
691 }
692 }
693}
694
695impl<'a> ::jacquard_lexicon::schema::LexiconSchema for ReplyRef<'a> {
696 fn nsid() -> &'static str {
697 "place.stream.chat.message"
698 }
699 fn def_name() -> &'static str {
700 "replyRef"
701 }
702 fn lexicon_doc() -> ::jacquard_lexicon::lexicon::LexiconDoc<'static> {
703 lexicon_doc_place_stream_chat_message()
704 }
705 fn validate(
706 &self,
707 ) -> ::std::result::Result<(), ::jacquard_lexicon::validation::ConstraintError> {
708 Ok(())
709 }
710}