A better Rust ATProto crate
1//! Compile-time validation crate for Pretty and Macro codegen modes.
2//!
3//! This crate has no runtime functionality. Its purpose is to verify that
4//! code generated in both Pretty mode (short names + use blocks) and Macro mode
5//! (fully-qualified paths) compiles successfully. The build script generates
6//! code from curated test lexicons into `src/generated/{pretty,macro_mode}/`.
7//!
8//! If this crate compiles, both codegen modes produce valid Rust.
9
10extern crate alloc;
11
12// Both generated module trees emit `use crate::builder_types::{...}` in
13// their state modules. This is hardcoded in the codegen, so re-export from
14// one of the generated copies at the crate root.
15#[path = "generated/pretty/builder_types.rs"]
16pub mod builder_types;
17
18// Pretty mode generated code — module tree with proper path resolution.
19// The build script generates with root_module="crate::pretty" so that
20// cross-module refs like `crate::pretty::app_bsky::...` resolve correctly
21// through the #[path] module boundary.
22#[path = "generated/pretty/lib.rs"]
23pub mod pretty;
24
25// Macro mode generated code (root_module="crate::macro_mode").
26#[path = "generated/macro_mode/lib.rs"]
27pub mod macro_mode;
28
29#[cfg(test)]
30mod tests {
31 // -- Pretty mode type accessibility --
32
33 #[test]
34 fn pretty_strong_ref_accessible() {
35 // Compile-time type check: strongRef from com.atproto.repo.
36 let _: Option<super::pretty::com_atproto::repo::strong_ref::StrongRef> = None;
37 }
38
39 #[test]
40 fn pretty_facet_types_accessible() {
41 // Compile-time type check: facet and its sub-defs.
42 let _: Option<super::pretty::app_bsky::richtext::facet::Facet> = None;
43 let _: Option<super::pretty::app_bsky::richtext::facet::Mention> = None;
44 let _: Option<super::pretty::app_bsky::richtext::facet::Link> = None;
45 let _: Option<super::pretty::app_bsky::richtext::facet::Tag> = None;
46 let _: Option<super::pretty::app_bsky::richtext::facet::ByteSlice> = None;
47 }
48
49 #[test]
50 fn pretty_label_defs_accessible() {
51 // Compile-time type check: defs types from com.atproto.label.
52 let _: Option<super::pretty::com_atproto::label::Label> = None;
53 }
54
55 #[test]
56 fn pretty_embed_external_accessible() {
57 // Compile-time type check: embed external types.
58 let _: Option<super::pretty::app_bsky::embed::external::ExternalRecord> = None;
59 let _: Option<super::pretty::app_bsky::embed::external::External> = None;
60 let _: Option<super::pretty::app_bsky::embed::external::View> = None;
61 let _: Option<super::pretty::app_bsky::embed::external::ViewExternal> = None;
62 }
63
64 #[test]
65 fn pretty_collision_collection_accessible() {
66 // Compile-time type check: local Collection type compiles despite trait name collision.
67 // The record is named CollectionRecord, the local def is Collection.
68 let _: Option<super::pretty::test_collision::collection::CollectionRecord> = None;
69 let _: Option<super::pretty::test_collision::collection::Collection> = None;
70 }
71
72 #[test]
73 fn pretty_collision_did_accessible() {
74 // Compile-time type check: local Did type compiles despite string type name collision.
75 // The main def is DidRecord, the local def is Did.
76 let _: Option<super::pretty::test_collision::did::DidRecord> = None;
77 let _: Option<super::pretty::test_collision::did::Did> = None;
78 }
79
80 #[test]
81 fn pretty_collision_option_accessible() {
82 // Compile-time type check: local Option type compiles despite std Option collision.
83 // The main def is OptionRecord, the local def is OptionRecordOption.
84 let _: Option<super::pretty::test_collision::option::OptionRecord> = None;
85 let _: Option<super::pretty::test_collision::option::OptionRecordOption> = None;
86 }
87
88 #[test]
89 fn pretty_cross_namespace_ns1_accessible() {
90 // Compile-time type check: types defined in test.ns1.defs.
91 let _: Option<super::pretty::test_ns1::Foo> = None;
92 let _: Option<super::pretty::test_ns1::Bar> = None;
93 }
94
95 #[test]
96 fn pretty_cross_namespace_ns2_accessible() {
97 // Compile-time type check: types in test.ns2 that reference test.ns1.
98 let _: Option<super::pretty::test_ns2::consumer::Consumer> = None;
99 }
100
101 #[test]
102 fn pretty_cross_namespace_ns3_collision_accessible() {
103 // Compile-time type check: ns3 defines local Foo AND refs external Foo.
104 let _: Option<super::pretty::test_ns3::collision::Collision> = None;
105 let _: Option<super::pretty::test_ns3::collision::Foo> = None;
106 }
107
108 // -- Macro mode type accessibility (same types, different module root) --
109
110 #[test]
111 fn macro_strong_ref_accessible() {
112 let _: Option<super::macro_mode::com_atproto::repo::strong_ref::StrongRef> = None;
113 }
114
115 #[test]
116 fn macro_facet_types_accessible() {
117 let _: Option<super::macro_mode::app_bsky::richtext::facet::Facet> = None;
118 let _: Option<super::macro_mode::app_bsky::richtext::facet::Mention> = None;
119 }
120
121 #[test]
122 fn macro_label_defs_accessible() {
123 let _: Option<super::macro_mode::com_atproto::label::Label> = None;
124 }
125
126 #[test]
127 fn macro_collision_collection_accessible() {
128 let _: Option<super::macro_mode::test_collision::collection::CollectionRecord> = None;
129 let _: Option<super::macro_mode::test_collision::collection::Collection> = None;
130 }
131
132 #[test]
133 fn macro_cross_namespace_ns1_accessible() {
134 let _: Option<super::macro_mode::test_ns1::Foo> = None;
135 let _: Option<super::macro_mode::test_ns1::Bar> = None;
136 }
137
138 #[test]
139 fn macro_cross_namespace_ns2_accessible() {
140 let _: Option<super::macro_mode::test_ns2::consumer::Consumer> = None;
141 }
142
143 #[test]
144 fn macro_cross_namespace_ns3_accessible() {
145 let _: Option<super::macro_mode::test_ns3::collision::Collision> = None;
146 let _: Option<super::macro_mode::test_ns3::collision::Foo> = None;
147 }
148}