A better Rust ATProto crate
102
fork

Configure Feed

Select the types of activity you want to include in your feed.

at pretty-codegen 148 lines 6.0 kB view raw
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}