A better Rust ATProto crate
1use jacquard_lexicon::lexicon::LexStringFormat;
2use jacquard_lexicon::schema::builder::LexiconDocBuilder;
3
4#[test]
5fn test_builder_simple_record() {
6 let doc = LexiconDocBuilder::new("app.example.test")
7 .description("Test record")
8 .record()
9 .key("tid")
10 .field("text", |f| f.string().max_length(1000).required().build())
11 .field("createdAt", |f| {
12 f.string()
13 .format(LexStringFormat::Datetime)
14 .required()
15 .build()
16 })
17 .build()
18 .build();
19
20 assert_eq!(doc.id.as_ref(), "app.example.test");
21 assert_eq!(doc.defs.len(), 1);
22
23 // Serialize and verify
24 let json = serde_json::to_string_pretty(&doc).unwrap();
25 println!("{}", json);
26
27 assert!(json.contains("\"type\": \"record\""));
28 assert!(json.contains("\"maxLength\": 1000"));
29}
30
31#[test]
32fn test_builder_query() {
33 let doc = LexiconDocBuilder::new("app.example.getPost")
34 .description("Get a post")
35 .query()
36 .description("Retrieve a post by URI")
37 .param_string("uri", true)
38 .build()
39 .build();
40
41 assert_eq!(doc.id.as_ref(), "app.example.getPost");
42 assert_eq!(doc.defs.len(), 1);
43
44 let json = serde_json::to_string_pretty(&doc).unwrap();
45 println!("{}", json);
46
47 assert!(json.contains("\"type\": \"query\""));
48}
49
50#[test]
51fn test_builder_object_with_ref() {
52 let doc = LexiconDocBuilder::new("app.example.types")
53 .object("post")
54 .field("uri", |f| {
55 f.string().format(LexStringFormat::AtUri).required().build()
56 })
57 .field("author", |f| f.ref_to("app.bsky.actor.defs#profileView"))
58 .build()
59 .build();
60
61 assert_eq!(doc.id.as_ref(), "app.example.types");
62 assert_eq!(doc.defs.len(), 1);
63
64 let json = serde_json::to_string_pretty(&doc).unwrap();
65 println!("{}", json);
66
67 assert!(json.contains("\"type\": \"ref\""));
68 assert!(json.contains("app.bsky.actor.defs#profileView"));
69}
70
71#[test]
72fn test_builder_array_field() {
73 let doc = LexiconDocBuilder::new("app.example.list")
74 .record()
75 .field("items", |f| f.array(|a| a.string_items().max_length(100)))
76 .build()
77 .build();
78
79 assert_eq!(doc.id.as_ref(), "app.example.list");
80
81 let json = serde_json::to_string_pretty(&doc).unwrap();
82 println!("{}", json);
83
84 assert!(json.contains("\"type\": \"array\""));
85}