jacquard_api/pub_leaflet/graph/
subscription.rs1#[allow(unused_imports)]
9use alloc::collections::BTreeMap;
10
11#[allow(unused_imports)]
12use core::marker::PhantomData;
13use jacquard_common::CowStr;
14
15#[allow(unused_imports)]
16use jacquard_common::deps::codegen::unicode_segmentation::UnicodeSegmentation;
17use jacquard_common::types::collection::{Collection, RecordError};
18use jacquard_common::types::string::{AtUri, Cid};
19use jacquard_common::types::uri::{RecordUri, UriError};
20use jacquard_common::xrpc::XrpcResp;
21use jacquard_derive::{IntoStatic, lexicon};
22use jacquard_lexicon::lexicon::LexiconDoc;
23use jacquard_lexicon::schema::LexiconSchema;
24
25#[allow(unused_imports)]
26use jacquard_lexicon::validation::{ConstraintError, ValidationPath};
27use serde::{Serialize, Deserialize};
28#[lexicon]
31#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, IntoStatic)]
32#[serde(
33 rename_all = "camelCase",
34 rename = "pub.leaflet.graph.subscription",
35 tag = "$type"
36)]
37pub struct Subscription<'a> {
38 #[serde(borrow)]
39 pub publication: AtUri<'a>,
40}
41
42#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, IntoStatic)]
45#[serde(rename_all = "camelCase")]
46pub struct SubscriptionGetRecordOutput<'a> {
47 #[serde(skip_serializing_if = "Option::is_none")]
48 #[serde(borrow)]
49 pub cid: Option<Cid<'a>>,
50 #[serde(borrow)]
51 pub uri: AtUri<'a>,
52 #[serde(borrow)]
53 pub value: Subscription<'a>,
54}
55
56impl<'a> Subscription<'a> {
57 pub fn uri(
58 uri: impl Into<CowStr<'a>>,
59 ) -> Result<RecordUri<'a, SubscriptionRecord>, UriError> {
60 RecordUri::try_from_uri(AtUri::new_cow(uri.into())?)
61 }
62}
63
64#[derive(Debug, Serialize, Deserialize)]
67pub struct SubscriptionRecord;
68impl XrpcResp for SubscriptionRecord {
69 const NSID: &'static str = "pub.leaflet.graph.subscription";
70 const ENCODING: &'static str = "application/json";
71 type Output<'de> = SubscriptionGetRecordOutput<'de>;
72 type Err<'de> = RecordError<'de>;
73}
74
75impl From<SubscriptionGetRecordOutput<'_>> for Subscription<'_> {
76 fn from(output: SubscriptionGetRecordOutput<'_>) -> Self {
77 use jacquard_common::IntoStatic;
78 output.value.into_static()
79 }
80}
81
82impl Collection for Subscription<'_> {
83 const NSID: &'static str = "pub.leaflet.graph.subscription";
84 type Record = SubscriptionRecord;
85}
86
87impl Collection for SubscriptionRecord {
88 const NSID: &'static str = "pub.leaflet.graph.subscription";
89 type Record = SubscriptionRecord;
90}
91
92impl<'a> LexiconSchema for Subscription<'a> {
93 fn nsid() -> &'static str {
94 "pub.leaflet.graph.subscription"
95 }
96 fn def_name() -> &'static str {
97 "main"
98 }
99 fn lexicon_doc() -> LexiconDoc<'static> {
100 lexicon_doc_pub_leaflet_graph_subscription()
101 }
102 fn validate(&self) -> Result<(), ConstraintError> {
103 Ok(())
104 }
105}
106
107pub mod subscription_state {
108
109 pub use crate::builder_types::{Set, Unset, IsSet, IsUnset};
110 #[allow(unused)]
111 use ::core::marker::PhantomData;
112 mod sealed {
113 pub trait Sealed {}
114 }
115 pub trait State: sealed::Sealed {
117 type Publication;
118 }
119 pub struct Empty(());
121 impl sealed::Sealed for Empty {}
122 impl State for Empty {
123 type Publication = Unset;
124 }
125 pub struct SetPublication<S: State = Empty>(PhantomData<fn() -> S>);
127 impl<S: State> sealed::Sealed for SetPublication<S> {}
128 impl<S: State> State for SetPublication<S> {
129 type Publication = Set<members::publication>;
130 }
131 #[allow(non_camel_case_types)]
133 pub mod members {
134 pub struct publication(());
136 }
137}
138
139pub struct SubscriptionBuilder<'a, S: subscription_state::State> {
141 _state: PhantomData<fn() -> S>,
142 _fields: (Option<AtUri<'a>>,),
143 _lifetime: PhantomData<&'a ()>,
144}
145
146impl<'a> Subscription<'a> {
147 pub fn new() -> SubscriptionBuilder<'a, subscription_state::Empty> {
149 SubscriptionBuilder::new()
150 }
151}
152
153impl<'a> SubscriptionBuilder<'a, subscription_state::Empty> {
154 pub fn new() -> Self {
156 SubscriptionBuilder {
157 _state: PhantomData,
158 _fields: (None,),
159 _lifetime: PhantomData,
160 }
161 }
162}
163
164impl<'a, S> SubscriptionBuilder<'a, S>
165where
166 S: subscription_state::State,
167 S::Publication: subscription_state::IsUnset,
168{
169 pub fn publication(
171 mut self,
172 value: impl Into<AtUri<'a>>,
173 ) -> SubscriptionBuilder<'a, subscription_state::SetPublication<S>> {
174 self._fields.0 = Option::Some(value.into());
175 SubscriptionBuilder {
176 _state: PhantomData,
177 _fields: self._fields,
178 _lifetime: PhantomData,
179 }
180 }
181}
182
183impl<'a, S> SubscriptionBuilder<'a, S>
184where
185 S: subscription_state::State,
186 S::Publication: subscription_state::IsSet,
187{
188 pub fn build(self) -> Subscription<'a> {
190 Subscription {
191 publication: self._fields.0.unwrap(),
192 extra_data: Default::default(),
193 }
194 }
195 pub fn build_with_data(
197 self,
198 extra_data: BTreeMap<
199 jacquard_common::deps::smol_str::SmolStr,
200 jacquard_common::types::value::Data<'a>,
201 >,
202 ) -> Subscription<'a> {
203 Subscription {
204 publication: self._fields.0.unwrap(),
205 extra_data: Some(extra_data),
206 }
207 }
208}
209
210fn lexicon_doc_pub_leaflet_graph_subscription() -> LexiconDoc<'static> {
211 #[allow(unused_imports)]
212 use jacquard_common::{CowStr, deps::smol_str::SmolStr, types::blob::MimeType};
213 use jacquard_lexicon::lexicon::*;
214 use alloc::collections::BTreeMap;
215 LexiconDoc {
216 lexicon: Lexicon::Lexicon1,
217 id: CowStr::new_static("pub.leaflet.graph.subscription"),
218 defs: {
219 let mut map = BTreeMap::new();
220 map.insert(
221 SmolStr::new_static("main"),
222 LexUserType::Record(LexRecord {
223 description: Some(
224 CowStr::new_static(
225 "Record declaring a subscription to a publication",
226 ),
227 ),
228 key: Some(CowStr::new_static("tid")),
229 record: LexRecordRecord::Object(LexObject {
230 required: Some(vec![SmolStr::new_static("publication")]),
231 properties: {
232 #[allow(unused_mut)]
233 let mut map = BTreeMap::new();
234 map.insert(
235 SmolStr::new_static("publication"),
236 LexObjectProperty::String(LexString {
237 format: Some(LexStringFormat::AtUri),
238 ..Default::default()
239 }),
240 );
241 map
242 },
243 ..Default::default()
244 }),
245 ..Default::default()
246 }),
247 );
248 map
249 },
250 ..Default::default()
251 }
252}