cli_sky/lexicon/
mod.rs

1use serde::{Deserialize, Serialize};
2use serde_with::skip_serializing_none;
3use std::collections::HashMap;
4
5// primitives
6
7#[skip_serializing_none]
8#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
9pub struct LexBoolean {
10    pub description: Option<String>,
11    pub default: Option<bool>,
12    pub r#const: Option<bool>,
13}
14
15/// The Lexicon type `integer`.
16///
17/// Lexicon integers are [specified] as signed and 64-bit, which means that values will
18/// always fit in an `i64`.
19///
20/// [specified]: https://atproto.com/specs/data-model#data-types
21#[skip_serializing_none]
22#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
23pub struct LexInteger {
24    pub description: Option<String>,
25    pub default: Option<i64>,
26    pub minimum: Option<i64>,
27    pub maximum: Option<i64>,
28    pub r#enum: Option<Vec<i64>>,
29    pub r#const: Option<i64>,
30}
31
32#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)]
33#[serde(rename_all = "kebab-case")]
34pub enum LexStringFormat {
35    Datetime,
36    Uri,
37    AtUri,
38    Did,
39    Handle,
40    AtIdentifier,
41    Nsid,
42    Cid,
43    Language,
44    Tid,
45    RecordKey,
46}
47#[skip_serializing_none]
48#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
49#[serde(rename_all = "camelCase")]
50pub struct LexString {
51    pub description: Option<String>,
52    pub format: Option<LexStringFormat>,
53    pub default: Option<String>,
54    pub min_length: Option<usize>,
55    pub max_length: Option<usize>,
56    pub min_graphemes: Option<usize>,
57    pub max_graphemes: Option<usize>,
58    pub r#enum: Option<Vec<String>>,
59    pub r#const: Option<String>,
60    pub known_values: Option<Vec<String>>,
61}
62
63#[skip_serializing_none]
64#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
65pub struct LexUnknown {
66    pub description: Option<String>,
67}
68
69// ipld types
70
71#[skip_serializing_none]
72#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
73#[serde(rename_all = "camelCase")]
74pub struct LexBytes {
75    pub description: Option<String>,
76    pub max_length: Option<usize>,
77    pub min_length: Option<usize>,
78}
79
80#[skip_serializing_none]
81#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
82pub struct LexCidLink {
83    pub description: Option<String>,
84}
85
86// references
87
88#[skip_serializing_none]
89#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
90pub struct LexRef {
91    pub description: Option<String>,
92    pub r#ref: String,
93}
94
95#[skip_serializing_none]
96#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
97pub struct LexRefUnion {
98    pub description: Option<String>,
99    pub refs: Vec<String>,
100    pub closed: Option<bool>,
101}
102
103// blobs
104
105#[skip_serializing_none]
106#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
107#[serde(rename_all = "camelCase")]
108pub struct LexBlob {
109    pub description: Option<String>,
110    pub accept: Option<Vec<String>>,
111    pub max_size: Option<usize>,
112}
113
114// complex types
115
116#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
117#[serde(tag = "type", rename_all = "kebab-case")]
118pub enum LexArrayItem {
119    // lexPrimitive
120    Boolean(LexBoolean),
121    Integer(LexInteger),
122    String(LexString),
123    Unknown(LexUnknown),
124    // lexIpldType
125    Bytes(LexBytes),
126    CidLink(LexCidLink),
127    // lexBlob
128    Blob(LexBlob),
129    // lexRefVariant
130    Ref(LexRef),
131    Union(LexRefUnion),
132}
133#[skip_serializing_none]
134#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
135#[serde(rename_all = "camelCase")]
136pub struct LexArray {
137    pub description: Option<String>,
138    pub items: LexArrayItem,
139    pub min_length: Option<usize>,
140    pub max_length: Option<usize>,
141}
142
143#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
144#[serde(tag = "type", rename_all = "lowercase")]
145pub enum LexPrimitiveArrayItem {
146    // lexPrimitive
147    Boolean(LexBoolean),
148    Integer(LexInteger),
149    String(LexString),
150    Unknown(LexUnknown),
151}
152#[skip_serializing_none]
153#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
154#[serde(rename_all = "camelCase")]
155pub struct LexPrimitiveArray {
156    pub description: Option<String>,
157    pub items: LexPrimitiveArrayItem,
158    pub min_length: Option<usize>,
159    pub max_length: Option<usize>,
160}
161
162#[skip_serializing_none]
163#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
164pub struct LexToken {
165    pub description: Option<String>,
166}
167
168#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
169#[serde(tag = "type", rename_all = "kebab-case")]
170pub enum LexObjectProperty {
171    // lexRefVariant
172    Ref(LexRef),
173    Union(LexRefUnion),
174    // lexIpldType
175    Bytes(LexBytes),
176    CidLink(LexCidLink),
177    // lexArray
178    Array(LexArray),
179    // lexBlob
180    Blob(LexBlob),
181    // lexPrimitive
182    Boolean(LexBoolean),
183    Integer(LexInteger),
184    String(LexString),
185    Unknown(LexUnknown),
186}
187#[skip_serializing_none]
188#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
189pub struct LexObject {
190    pub description: Option<String>,
191    pub required: Option<Vec<String>>,
192    pub nullable: Option<Vec<String>>,
193    pub properties: HashMap<String, LexObjectProperty>,
194}
195
196// xrpc
197
198#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
199#[serde(tag = "type", rename_all = "lowercase")]
200pub enum LexXrpcParametersProperty {
201    // lexPrimitive
202    Boolean(LexBoolean),
203    Integer(LexInteger),
204    String(LexString),
205    Unknown(LexUnknown),
206    // lexPrimitiveArray
207    Array(LexPrimitiveArray),
208}
209#[skip_serializing_none]
210#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
211pub struct LexXrpcParameters {
212    pub description: Option<String>,
213    pub required: Option<Vec<String>>,
214    pub properties: HashMap<String, LexXrpcParametersProperty>,
215}
216
217#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
218#[serde(tag = "type", rename_all = "lowercase")]
219pub enum LexXrpcBodySchema {
220    // lexRefVariant
221    Ref(LexRef),
222    Union(LexRefUnion),
223    // lexObject
224    Object(LexObject),
225}
226#[skip_serializing_none]
227#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
228pub struct LexXrpcBody {
229    pub description: Option<String>,
230    pub encoding: String,
231    pub schema: Option<LexXrpcBodySchema>,
232}
233
234#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
235#[serde(tag = "type", rename_all = "lowercase")]
236pub enum LexXrpcSubscriptionMessageSchema {
237    // lexRefVariant
238    Ref(LexRef),
239    Union(LexRefUnion),
240    // lexObject
241    Object(LexObject),
242}
243#[skip_serializing_none]
244#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
245pub struct LexXrpcSubscriptionMessage {
246    pub description: Option<String>,
247    pub schema: Option<LexXrpcSubscriptionMessageSchema>,
248}
249
250#[skip_serializing_none]
251#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
252pub struct LexXrpcError {
253    pub description: Option<String>,
254    pub name: String,
255}
256
257#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
258#[serde(tag = "type", rename_all = "lowercase")]
259pub enum LexXrpcQueryParameter {
260    Params(LexXrpcParameters),
261}
262#[skip_serializing_none]
263#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
264pub struct LexXrpcQuery {
265    pub description: Option<String>,
266    pub parameters: Option<LexXrpcQueryParameter>,
267    pub output: Option<LexXrpcBody>,
268    pub errors: Option<Vec<LexXrpcError>>,
269}
270
271#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
272#[serde(tag = "type", rename_all = "lowercase")]
273pub enum LexXrpcProcedureParameter {
274    Params(LexXrpcParameters),
275}
276#[skip_serializing_none]
277#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
278pub struct LexXrpcProcedure {
279    pub description: Option<String>,
280    pub parameters: Option<LexXrpcProcedureParameter>,
281    pub input: Option<LexXrpcBody>,
282    pub output: Option<LexXrpcBody>,
283    pub errors: Option<Vec<LexXrpcError>>,
284}
285
286#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
287#[serde(tag = "type", rename_all = "lowercase")]
288pub enum LexXrpcSubscriptionParameter {
289    Params(LexXrpcParameters),
290}
291#[skip_serializing_none]
292#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
293pub struct LexXrpcSubscription {
294    pub description: Option<String>,
295    pub parameters: Option<LexXrpcSubscriptionParameter>,
296    pub message: Option<LexXrpcSubscriptionMessage>,
297    pub infos: Option<Vec<LexXrpcError>>,
298    pub errors: Option<Vec<LexXrpcError>>,
299}
300
301// database
302
303#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
304#[serde(tag = "type", rename_all = "lowercase")]
305pub enum LexRecordRecord {
306    Object(LexObject),
307}
308#[skip_serializing_none]
309#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
310pub struct LexRecord {
311    pub description: Option<String>,
312    pub key: Option<String>,
313    pub record: LexRecordRecord,
314}
315
316// core
317
318#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
319#[serde(tag = "type", rename_all = "kebab-case")]
320pub enum LexUserType {
321    // lexRecord
322    Record(LexRecord),
323    // lexXrpcQuery
324    #[serde(rename = "query")]
325    XrpcQuery(LexXrpcQuery),
326    // lexXrpcProcedure
327    #[serde(rename = "procedure")]
328    XrpcProcedure(LexXrpcProcedure),
329    // lexXrpcSubscription
330    #[serde(rename = "subscription")]
331    XrpcSubscription(LexXrpcSubscription),
332    // lexBlob
333    Blob(LexBlob),
334    // lexArray
335    Array(LexArray),
336    // lexToken
337    Token(LexToken),
338    // lexObject
339    Object(LexObject),
340    // lexBoolean,
341    Boolean(LexBoolean),
342    // lexInteger,
343    Integer(LexInteger),
344    // lexString,
345    String(LexString),
346    // lexBytes
347    Bytes(LexBytes),
348    // lexCidLink
349    CidLink(LexCidLink),
350    // lexUnknown
351    Unknown(LexUnknown),
352}
353
354pub mod record;
355pub mod client;
356pub mod wrapper;