atproto blogging
1// @generated by jacquard-lexicon. DO NOT EDIT.
2//
3// Lexicon: app.bsky.unspecced.getPostThreadV2
4//
5// This file was automatically generated from Lexicon schemas.
6// Any manual changes will be overwritten on the next regeneration.
7
8#[derive(
9 serde::Serialize,
10 serde::Deserialize,
11 Debug,
12 Clone,
13 PartialEq,
14 Eq,
15 jacquard_derive::IntoStatic
16)]
17#[serde(rename_all = "camelCase")]
18pub struct GetPostThreadV2<'a> {
19 /// (default: true)
20 #[serde(skip_serializing_if = "std::option::Option::is_none")]
21 pub above: std::option::Option<bool>,
22 #[serde(borrow)]
23 pub anchor: jacquard_common::types::string::AtUri<'a>,
24 ///(default: 6, min: 0, max: 20)
25 #[serde(skip_serializing_if = "std::option::Option::is_none")]
26 pub below: std::option::Option<i64>,
27 ///(default: 10, min: 0, max: 100)
28 #[serde(skip_serializing_if = "std::option::Option::is_none")]
29 pub branching_factor: std::option::Option<i64>,
30 ///(default: "oldest")
31 #[serde(skip_serializing_if = "std::option::Option::is_none")]
32 #[serde(borrow)]
33 pub sort: std::option::Option<jacquard_common::CowStr<'a>>,
34}
35
36pub mod get_post_thread_v2_state {
37
38 pub use crate::builder_types::{Set, Unset, IsSet, IsUnset};
39 #[allow(unused)]
40 use ::core::marker::PhantomData;
41 mod sealed {
42 pub trait Sealed {}
43 }
44 /// State trait tracking which required fields have been set
45 pub trait State: sealed::Sealed {
46 type Anchor;
47 }
48 /// Empty state - all required fields are unset
49 pub struct Empty(());
50 impl sealed::Sealed for Empty {}
51 impl State for Empty {
52 type Anchor = Unset;
53 }
54 ///State transition - sets the `anchor` field to Set
55 pub struct SetAnchor<S: State = Empty>(PhantomData<fn() -> S>);
56 impl<S: State> sealed::Sealed for SetAnchor<S> {}
57 impl<S: State> State for SetAnchor<S> {
58 type Anchor = Set<members::anchor>;
59 }
60 /// Marker types for field names
61 #[allow(non_camel_case_types)]
62 pub mod members {
63 ///Marker type for the `anchor` field
64 pub struct anchor(());
65 }
66}
67
68/// Builder for constructing an instance of this type
69pub struct GetPostThreadV2Builder<'a, S: get_post_thread_v2_state::State> {
70 _phantom_state: ::core::marker::PhantomData<fn() -> S>,
71 __unsafe_private_named: (
72 ::core::option::Option<bool>,
73 ::core::option::Option<jacquard_common::types::string::AtUri<'a>>,
74 ::core::option::Option<i64>,
75 ::core::option::Option<i64>,
76 ::core::option::Option<jacquard_common::CowStr<'a>>,
77 ),
78 _phantom: ::core::marker::PhantomData<&'a ()>,
79}
80
81impl<'a> GetPostThreadV2<'a> {
82 /// Create a new builder for this type
83 pub fn new() -> GetPostThreadV2Builder<'a, get_post_thread_v2_state::Empty> {
84 GetPostThreadV2Builder::new()
85 }
86}
87
88impl<'a> GetPostThreadV2Builder<'a, get_post_thread_v2_state::Empty> {
89 /// Create a new builder with all fields unset
90 pub fn new() -> Self {
91 GetPostThreadV2Builder {
92 _phantom_state: ::core::marker::PhantomData,
93 __unsafe_private_named: (None, None, None, None, None),
94 _phantom: ::core::marker::PhantomData,
95 }
96 }
97}
98
99impl<'a, S: get_post_thread_v2_state::State> GetPostThreadV2Builder<'a, S> {
100 /// Set the `above` field (optional)
101 pub fn above(mut self, value: impl Into<Option<bool>>) -> Self {
102 self.__unsafe_private_named.0 = value.into();
103 self
104 }
105 /// Set the `above` field to an Option value (optional)
106 pub fn maybe_above(mut self, value: Option<bool>) -> Self {
107 self.__unsafe_private_named.0 = value;
108 self
109 }
110}
111
112impl<'a, S> GetPostThreadV2Builder<'a, S>
113where
114 S: get_post_thread_v2_state::State,
115 S::Anchor: get_post_thread_v2_state::IsUnset,
116{
117 /// Set the `anchor` field (required)
118 pub fn anchor(
119 mut self,
120 value: impl Into<jacquard_common::types::string::AtUri<'a>>,
121 ) -> GetPostThreadV2Builder<'a, get_post_thread_v2_state::SetAnchor<S>> {
122 self.__unsafe_private_named.1 = ::core::option::Option::Some(value.into());
123 GetPostThreadV2Builder {
124 _phantom_state: ::core::marker::PhantomData,
125 __unsafe_private_named: self.__unsafe_private_named,
126 _phantom: ::core::marker::PhantomData,
127 }
128 }
129}
130
131impl<'a, S: get_post_thread_v2_state::State> GetPostThreadV2Builder<'a, S> {
132 /// Set the `below` field (optional)
133 pub fn below(mut self, value: impl Into<Option<i64>>) -> Self {
134 self.__unsafe_private_named.2 = value.into();
135 self
136 }
137 /// Set the `below` field to an Option value (optional)
138 pub fn maybe_below(mut self, value: Option<i64>) -> Self {
139 self.__unsafe_private_named.2 = value;
140 self
141 }
142}
143
144impl<'a, S: get_post_thread_v2_state::State> GetPostThreadV2Builder<'a, S> {
145 /// Set the `branchingFactor` field (optional)
146 pub fn branching_factor(mut self, value: impl Into<Option<i64>>) -> Self {
147 self.__unsafe_private_named.3 = value.into();
148 self
149 }
150 /// Set the `branchingFactor` field to an Option value (optional)
151 pub fn maybe_branching_factor(mut self, value: Option<i64>) -> Self {
152 self.__unsafe_private_named.3 = value;
153 self
154 }
155}
156
157impl<'a, S: get_post_thread_v2_state::State> GetPostThreadV2Builder<'a, S> {
158 /// Set the `sort` field (optional)
159 pub fn sort(
160 mut self,
161 value: impl Into<Option<jacquard_common::CowStr<'a>>>,
162 ) -> Self {
163 self.__unsafe_private_named.4 = value.into();
164 self
165 }
166 /// Set the `sort` field to an Option value (optional)
167 pub fn maybe_sort(mut self, value: Option<jacquard_common::CowStr<'a>>) -> Self {
168 self.__unsafe_private_named.4 = value;
169 self
170 }
171}
172
173impl<'a, S> GetPostThreadV2Builder<'a, S>
174where
175 S: get_post_thread_v2_state::State,
176 S::Anchor: get_post_thread_v2_state::IsSet,
177{
178 /// Build the final struct
179 pub fn build(self) -> GetPostThreadV2<'a> {
180 GetPostThreadV2 {
181 above: self.__unsafe_private_named.0,
182 anchor: self.__unsafe_private_named.1.unwrap(),
183 below: self.__unsafe_private_named.2,
184 branching_factor: self.__unsafe_private_named.3,
185 sort: self.__unsafe_private_named.4,
186 }
187 }
188}
189
190#[jacquard_derive::lexicon]
191#[derive(
192 serde::Serialize,
193 serde::Deserialize,
194 Debug,
195 Clone,
196 PartialEq,
197 Eq,
198 jacquard_derive::IntoStatic
199)]
200#[serde(rename_all = "camelCase")]
201pub struct GetPostThreadV2Output<'a> {
202 /// Whether this thread has additional replies. If true, a call can be made to the `getPostThreadOtherV2` endpoint to retrieve them.
203 pub has_other_replies: bool,
204 /// A flat list of thread items. The depth of each item is indicated by the depth property inside the item.
205 #[serde(borrow)]
206 pub thread: Vec<crate::app_bsky::unspecced::get_post_thread_v2::ThreadItem<'a>>,
207 #[serde(skip_serializing_if = "std::option::Option::is_none")]
208 #[serde(borrow)]
209 pub threadgate: std::option::Option<crate::app_bsky::feed::ThreadgateView<'a>>,
210}
211
212/// Response type for
213///app.bsky.unspecced.getPostThreadV2
214pub struct GetPostThreadV2Response;
215impl jacquard_common::xrpc::XrpcResp for GetPostThreadV2Response {
216 const NSID: &'static str = "app.bsky.unspecced.getPostThreadV2";
217 const ENCODING: &'static str = "application/json";
218 type Output<'de> = GetPostThreadV2Output<'de>;
219 type Err<'de> = jacquard_common::xrpc::GenericError<'de>;
220}
221
222impl<'a> jacquard_common::xrpc::XrpcRequest for GetPostThreadV2<'a> {
223 const NSID: &'static str = "app.bsky.unspecced.getPostThreadV2";
224 const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query;
225 type Response = GetPostThreadV2Response;
226}
227
228/// Endpoint type for
229///app.bsky.unspecced.getPostThreadV2
230pub struct GetPostThreadV2Request;
231impl jacquard_common::xrpc::XrpcEndpoint for GetPostThreadV2Request {
232 const PATH: &'static str = "/xrpc/app.bsky.unspecced.getPostThreadV2";
233 const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query;
234 type Request<'de> = GetPostThreadV2<'de>;
235 type Response = GetPostThreadV2Response;
236}
237
238#[jacquard_derive::lexicon]
239#[derive(
240 serde::Serialize,
241 serde::Deserialize,
242 Debug,
243 Clone,
244 PartialEq,
245 Eq,
246 jacquard_derive::IntoStatic
247)]
248#[serde(rename_all = "camelCase")]
249pub struct ThreadItem<'a> {
250 /// The nesting level of this item in the thread. Depth 0 means the anchor item. Items above have negative depths, items below have positive depths.
251 pub depth: i64,
252 #[serde(borrow)]
253 pub uri: jacquard_common::types::string::AtUri<'a>,
254 #[serde(borrow)]
255 pub value: ThreadItemValue<'a>,
256}
257
258pub mod thread_item_state {
259
260 pub use crate::builder_types::{Set, Unset, IsSet, IsUnset};
261 #[allow(unused)]
262 use ::core::marker::PhantomData;
263 mod sealed {
264 pub trait Sealed {}
265 }
266 /// State trait tracking which required fields have been set
267 pub trait State: sealed::Sealed {
268 type Value;
269 type Uri;
270 type Depth;
271 }
272 /// Empty state - all required fields are unset
273 pub struct Empty(());
274 impl sealed::Sealed for Empty {}
275 impl State for Empty {
276 type Value = Unset;
277 type Uri = Unset;
278 type Depth = Unset;
279 }
280 ///State transition - sets the `value` field to Set
281 pub struct SetValue<S: State = Empty>(PhantomData<fn() -> S>);
282 impl<S: State> sealed::Sealed for SetValue<S> {}
283 impl<S: State> State for SetValue<S> {
284 type Value = Set<members::value>;
285 type Uri = S::Uri;
286 type Depth = S::Depth;
287 }
288 ///State transition - sets the `uri` field to Set
289 pub struct SetUri<S: State = Empty>(PhantomData<fn() -> S>);
290 impl<S: State> sealed::Sealed for SetUri<S> {}
291 impl<S: State> State for SetUri<S> {
292 type Value = S::Value;
293 type Uri = Set<members::uri>;
294 type Depth = S::Depth;
295 }
296 ///State transition - sets the `depth` field to Set
297 pub struct SetDepth<S: State = Empty>(PhantomData<fn() -> S>);
298 impl<S: State> sealed::Sealed for SetDepth<S> {}
299 impl<S: State> State for SetDepth<S> {
300 type Value = S::Value;
301 type Uri = S::Uri;
302 type Depth = Set<members::depth>;
303 }
304 /// Marker types for field names
305 #[allow(non_camel_case_types)]
306 pub mod members {
307 ///Marker type for the `value` field
308 pub struct value(());
309 ///Marker type for the `uri` field
310 pub struct uri(());
311 ///Marker type for the `depth` field
312 pub struct depth(());
313 }
314}
315
316/// Builder for constructing an instance of this type
317pub struct ThreadItemBuilder<'a, S: thread_item_state::State> {
318 _phantom_state: ::core::marker::PhantomData<fn() -> S>,
319 __unsafe_private_named: (
320 ::core::option::Option<i64>,
321 ::core::option::Option<jacquard_common::types::string::AtUri<'a>>,
322 ::core::option::Option<ThreadItemValue<'a>>,
323 ),
324 _phantom: ::core::marker::PhantomData<&'a ()>,
325}
326
327impl<'a> ThreadItem<'a> {
328 /// Create a new builder for this type
329 pub fn new() -> ThreadItemBuilder<'a, thread_item_state::Empty> {
330 ThreadItemBuilder::new()
331 }
332}
333
334impl<'a> ThreadItemBuilder<'a, thread_item_state::Empty> {
335 /// Create a new builder with all fields unset
336 pub fn new() -> Self {
337 ThreadItemBuilder {
338 _phantom_state: ::core::marker::PhantomData,
339 __unsafe_private_named: (None, None, None),
340 _phantom: ::core::marker::PhantomData,
341 }
342 }
343}
344
345impl<'a, S> ThreadItemBuilder<'a, S>
346where
347 S: thread_item_state::State,
348 S::Depth: thread_item_state::IsUnset,
349{
350 /// Set the `depth` field (required)
351 pub fn depth(
352 mut self,
353 value: impl Into<i64>,
354 ) -> ThreadItemBuilder<'a, thread_item_state::SetDepth<S>> {
355 self.__unsafe_private_named.0 = ::core::option::Option::Some(value.into());
356 ThreadItemBuilder {
357 _phantom_state: ::core::marker::PhantomData,
358 __unsafe_private_named: self.__unsafe_private_named,
359 _phantom: ::core::marker::PhantomData,
360 }
361 }
362}
363
364impl<'a, S> ThreadItemBuilder<'a, S>
365where
366 S: thread_item_state::State,
367 S::Uri: thread_item_state::IsUnset,
368{
369 /// Set the `uri` field (required)
370 pub fn uri(
371 mut self,
372 value: impl Into<jacquard_common::types::string::AtUri<'a>>,
373 ) -> ThreadItemBuilder<'a, thread_item_state::SetUri<S>> {
374 self.__unsafe_private_named.1 = ::core::option::Option::Some(value.into());
375 ThreadItemBuilder {
376 _phantom_state: ::core::marker::PhantomData,
377 __unsafe_private_named: self.__unsafe_private_named,
378 _phantom: ::core::marker::PhantomData,
379 }
380 }
381}
382
383impl<'a, S> ThreadItemBuilder<'a, S>
384where
385 S: thread_item_state::State,
386 S::Value: thread_item_state::IsUnset,
387{
388 /// Set the `value` field (required)
389 pub fn value(
390 mut self,
391 value: impl Into<ThreadItemValue<'a>>,
392 ) -> ThreadItemBuilder<'a, thread_item_state::SetValue<S>> {
393 self.__unsafe_private_named.2 = ::core::option::Option::Some(value.into());
394 ThreadItemBuilder {
395 _phantom_state: ::core::marker::PhantomData,
396 __unsafe_private_named: self.__unsafe_private_named,
397 _phantom: ::core::marker::PhantomData,
398 }
399 }
400}
401
402impl<'a, S> ThreadItemBuilder<'a, S>
403where
404 S: thread_item_state::State,
405 S::Value: thread_item_state::IsSet,
406 S::Uri: thread_item_state::IsSet,
407 S::Depth: thread_item_state::IsSet,
408{
409 /// Build the final struct
410 pub fn build(self) -> ThreadItem<'a> {
411 ThreadItem {
412 depth: self.__unsafe_private_named.0.unwrap(),
413 uri: self.__unsafe_private_named.1.unwrap(),
414 value: self.__unsafe_private_named.2.unwrap(),
415 extra_data: Default::default(),
416 }
417 }
418 /// Build the final struct with custom extra_data
419 pub fn build_with_data(
420 self,
421 extra_data: std::collections::BTreeMap<
422 jacquard_common::smol_str::SmolStr,
423 jacquard_common::types::value::Data<'a>,
424 >,
425 ) -> ThreadItem<'a> {
426 ThreadItem {
427 depth: self.__unsafe_private_named.0.unwrap(),
428 uri: self.__unsafe_private_named.1.unwrap(),
429 value: self.__unsafe_private_named.2.unwrap(),
430 extra_data: Some(extra_data),
431 }
432 }
433}
434
435#[jacquard_derive::open_union]
436#[derive(
437 serde::Serialize,
438 serde::Deserialize,
439 Debug,
440 Clone,
441 PartialEq,
442 Eq,
443 jacquard_derive::IntoStatic
444)]
445#[serde(tag = "$type")]
446#[serde(bound(deserialize = "'de: 'a"))]
447pub enum ThreadItemValue<'a> {
448 #[serde(rename = "app.bsky.unspecced.defs#threadItemPost")]
449 ThreadItemPost(Box<crate::app_bsky::unspecced::ThreadItemPost<'a>>),
450 #[serde(rename = "app.bsky.unspecced.defs#threadItemNoUnauthenticated")]
451 ThreadItemNoUnauthenticated(
452 Box<crate::app_bsky::unspecced::ThreadItemNoUnauthenticated<'a>>,
453 ),
454 #[serde(rename = "app.bsky.unspecced.defs#threadItemNotFound")]
455 ThreadItemNotFound(Box<crate::app_bsky::unspecced::ThreadItemNotFound<'a>>),
456 #[serde(rename = "app.bsky.unspecced.defs#threadItemBlocked")]
457 ThreadItemBlocked(Box<crate::app_bsky::unspecced::ThreadItemBlocked<'a>>),
458}
459
460fn lexicon_doc_app_bsky_unspecced_getPostThreadV2() -> ::jacquard_lexicon::lexicon::LexiconDoc<
461 'static,
462> {
463 ::jacquard_lexicon::lexicon::LexiconDoc {
464 lexicon: ::jacquard_lexicon::lexicon::Lexicon::Lexicon1,
465 id: ::jacquard_common::CowStr::new_static("app.bsky.unspecced.getPostThreadV2"),
466 revision: None,
467 description: None,
468 defs: {
469 let mut map = ::alloc::collections::BTreeMap::new();
470 map.insert(
471 ::jacquard_common::smol_str::SmolStr::new_static("main"),
472 ::jacquard_lexicon::lexicon::LexUserType::XrpcQuery(::jacquard_lexicon::lexicon::LexXrpcQuery {
473 description: None,
474 parameters: Some(
475 ::jacquard_lexicon::lexicon::LexXrpcQueryParameter::Params(::jacquard_lexicon::lexicon::LexXrpcParameters {
476 description: None,
477 required: Some(
478 vec![
479 ::jacquard_common::smol_str::SmolStr::new_static("anchor")
480 ],
481 ),
482 properties: {
483 #[allow(unused_mut)]
484 let mut map = ::alloc::collections::BTreeMap::new();
485 map.insert(
486 ::jacquard_common::smol_str::SmolStr::new_static("above"),
487 ::jacquard_lexicon::lexicon::LexXrpcParametersProperty::Boolean(::jacquard_lexicon::lexicon::LexBoolean {
488 description: None,
489 default: None,
490 r#const: None,
491 }),
492 );
493 map.insert(
494 ::jacquard_common::smol_str::SmolStr::new_static("anchor"),
495 ::jacquard_lexicon::lexicon::LexXrpcParametersProperty::String(::jacquard_lexicon::lexicon::LexString {
496 description: Some(
497 ::jacquard_common::CowStr::new_static(
498 "Reference (AT-URI) to post record. This is the anchor post, and the thread will be built around it. It can be any post in the tree, not necessarily a root post.",
499 ),
500 ),
501 format: Some(
502 ::jacquard_lexicon::lexicon::LexStringFormat::AtUri,
503 ),
504 default: None,
505 min_length: None,
506 max_length: None,
507 min_graphemes: None,
508 max_graphemes: None,
509 r#enum: None,
510 r#const: None,
511 known_values: None,
512 }),
513 );
514 map.insert(
515 ::jacquard_common::smol_str::SmolStr::new_static("below"),
516 ::jacquard_lexicon::lexicon::LexXrpcParametersProperty::Integer(::jacquard_lexicon::lexicon::LexInteger {
517 description: None,
518 default: None,
519 minimum: None,
520 maximum: None,
521 r#enum: None,
522 r#const: None,
523 }),
524 );
525 map.insert(
526 ::jacquard_common::smol_str::SmolStr::new_static(
527 "branchingFactor",
528 ),
529 ::jacquard_lexicon::lexicon::LexXrpcParametersProperty::Integer(::jacquard_lexicon::lexicon::LexInteger {
530 description: None,
531 default: None,
532 minimum: None,
533 maximum: None,
534 r#enum: None,
535 r#const: None,
536 }),
537 );
538 map.insert(
539 ::jacquard_common::smol_str::SmolStr::new_static("sort"),
540 ::jacquard_lexicon::lexicon::LexXrpcParametersProperty::String(::jacquard_lexicon::lexicon::LexString {
541 description: Some(
542 ::jacquard_common::CowStr::new_static(
543 "Sorting for the thread replies.",
544 ),
545 ),
546 format: None,
547 default: None,
548 min_length: None,
549 max_length: None,
550 min_graphemes: None,
551 max_graphemes: None,
552 r#enum: None,
553 r#const: None,
554 known_values: None,
555 }),
556 );
557 map
558 },
559 }),
560 ),
561 output: None,
562 errors: None,
563 }),
564 );
565 map.insert(
566 ::jacquard_common::smol_str::SmolStr::new_static("threadItem"),
567 ::jacquard_lexicon::lexicon::LexUserType::Object(::jacquard_lexicon::lexicon::LexObject {
568 description: None,
569 required: Some(
570 vec![
571 ::jacquard_common::smol_str::SmolStr::new_static("uri"),
572 ::jacquard_common::smol_str::SmolStr::new_static("depth"),
573 ::jacquard_common::smol_str::SmolStr::new_static("value")
574 ],
575 ),
576 nullable: None,
577 properties: {
578 #[allow(unused_mut)]
579 let mut map = ::alloc::collections::BTreeMap::new();
580 map.insert(
581 ::jacquard_common::smol_str::SmolStr::new_static("depth"),
582 ::jacquard_lexicon::lexicon::LexObjectProperty::Integer(::jacquard_lexicon::lexicon::LexInteger {
583 description: None,
584 default: None,
585 minimum: None,
586 maximum: None,
587 r#enum: None,
588 r#const: None,
589 }),
590 );
591 map.insert(
592 ::jacquard_common::smol_str::SmolStr::new_static("uri"),
593 ::jacquard_lexicon::lexicon::LexObjectProperty::String(::jacquard_lexicon::lexicon::LexString {
594 description: None,
595 format: Some(
596 ::jacquard_lexicon::lexicon::LexStringFormat::AtUri,
597 ),
598 default: None,
599 min_length: None,
600 max_length: None,
601 min_graphemes: None,
602 max_graphemes: None,
603 r#enum: None,
604 r#const: None,
605 known_values: None,
606 }),
607 );
608 map.insert(
609 ::jacquard_common::smol_str::SmolStr::new_static("value"),
610 ::jacquard_lexicon::lexicon::LexObjectProperty::Union(::jacquard_lexicon::lexicon::LexRefUnion {
611 description: None,
612 refs: vec![
613 ::jacquard_common::CowStr::new_static("app.bsky.unspecced.defs#threadItemPost"),
614 ::jacquard_common::CowStr::new_static("app.bsky.unspecced.defs#threadItemNoUnauthenticated"),
615 ::jacquard_common::CowStr::new_static("app.bsky.unspecced.defs#threadItemNotFound"),
616 ::jacquard_common::CowStr::new_static("app.bsky.unspecced.defs#threadItemBlocked")
617 ],
618 closed: None,
619 }),
620 );
621 map
622 },
623 }),
624 );
625 map
626 },
627 }
628}
629
630impl<'a> ::jacquard_lexicon::schema::LexiconSchema for ThreadItem<'a> {
631 fn nsid() -> &'static str {
632 "app.bsky.unspecced.getPostThreadV2"
633 }
634 fn def_name() -> &'static str {
635 "threadItem"
636 }
637 fn lexicon_doc() -> ::jacquard_lexicon::lexicon::LexiconDoc<'static> {
638 lexicon_doc_app_bsky_unspecced_getPostThreadV2()
639 }
640 fn validate(
641 &self,
642 ) -> ::core::result::Result<(), ::jacquard_lexicon::validation::ConstraintError> {
643 Ok(())
644 }
645}