package_matrix.rs (6814B)
1 use std::collections::BTreeSet; 2 3 #[derive(Clone, Copy, Debug, Eq, PartialEq)] 4 pub struct PackageSpec { 5 pub key: &'static str, 6 pub crate_name: &'static str, 7 pub crate_dir: &'static str, 8 pub package_name: &'static str, 9 pub package_dir: &'static str, 10 } 11 12 #[derive(Clone, Copy, Debug, Eq, PartialEq)] 13 pub struct WasmPackageSpec { 14 pub key: &'static str, 15 pub crate_name: &'static str, 16 pub crate_dir: &'static str, 17 pub package_name: &'static str, 18 pub package_dir: &'static str, 19 pub out_name: &'static str, 20 pub out_dir: &'static str, 21 } 22 23 pub const PACKAGE_SPECS: [PackageSpec; 7] = [ 24 PackageSpec { 25 key: "core", 26 crate_name: "radroots_core_bindings", 27 crate_dir: "crates/core_bindings", 28 package_name: "@radroots/core-bindings", 29 package_dir: "packages/core-bindings", 30 }, 31 PackageSpec { 32 key: "events", 33 crate_name: "radroots_events_bindings", 34 crate_dir: "crates/events_bindings", 35 package_name: "@radroots/events-bindings", 36 package_dir: "packages/events-bindings", 37 }, 38 PackageSpec { 39 key: "events_indexed", 40 crate_name: "radroots_events_indexed_bindings", 41 crate_dir: "crates/events_indexed_bindings", 42 package_name: "@radroots/events-indexed-bindings", 43 package_dir: "packages/events-indexed-bindings", 44 }, 45 PackageSpec { 46 key: "identity", 47 crate_name: "radroots_identity_bindings", 48 crate_dir: "crates/identity_bindings", 49 package_name: "@radroots/identity-bindings", 50 package_dir: "packages/identity-bindings", 51 }, 52 PackageSpec { 53 key: "replica_db_schema", 54 crate_name: "radroots_replica_db_schema_bindings", 55 crate_dir: "crates/replica_db_schema_bindings", 56 package_name: "@radroots/replica-db-schema-bindings", 57 package_dir: "packages/replica-db-schema-bindings", 58 }, 59 PackageSpec { 60 key: "trade", 61 crate_name: "radroots_trade_bindings", 62 crate_dir: "crates/trade_bindings", 63 package_name: "@radroots/trade-bindings", 64 package_dir: "packages/trade-bindings", 65 }, 66 PackageSpec { 67 key: "types", 68 crate_name: "radroots_types_bindings", 69 crate_dir: "crates/types_bindings", 70 package_name: "@radroots/types-bindings", 71 package_dir: "packages/types-bindings", 72 }, 73 ]; 74 75 pub const WASM_PACKAGE_SPECS: [WasmPackageSpec; 3] = [ 76 WasmPackageSpec { 77 key: "events_codec", 78 crate_name: "radroots_events_codec_wasm", 79 crate_dir: "crates/events_codec_wasm", 80 package_name: "@radroots/events-codec-wasm", 81 package_dir: "packages/events-codec-wasm", 82 out_name: "radroots_events_codec_wasm", 83 out_dir: "../../packages/events-codec-wasm/dist", 84 }, 85 WasmPackageSpec { 86 key: "replica_db", 87 crate_name: "radroots_replica_db_wasm", 88 crate_dir: "crates/replica_db_wasm", 89 package_name: "@radroots/replica-db-wasm", 90 package_dir: "packages/replica-db-wasm", 91 out_name: "radroots_replica_db_wasm", 92 out_dir: "../../packages/replica-db-wasm/dist", 93 }, 94 WasmPackageSpec { 95 key: "replica_sync", 96 crate_name: "radroots_replica_sync_wasm", 97 crate_dir: "crates/replica_sync_wasm", 98 package_name: "@radroots/replica-sync-wasm", 99 package_dir: "packages/replica-sync-wasm", 100 out_name: "radroots_replica_sync_wasm", 101 out_dir: "../../packages/replica-sync-wasm/dist", 102 }, 103 ]; 104 105 pub const FORBIDDEN_PACKAGE_NAMES: [&str; 2] = 106 ["@radroots/tangle-db-schema-bindings", "@radroots/contracts"]; 107 108 pub fn package_specs() -> &'static [PackageSpec] { 109 &PACKAGE_SPECS 110 } 111 112 pub fn wasm_package_specs() -> &'static [WasmPackageSpec] { 113 &WASM_PACKAGE_SPECS 114 } 115 116 pub fn validate_package_matrix() -> Result<(), String> { 117 let mut crate_names = BTreeSet::new(); 118 let mut package_names = BTreeSet::new(); 119 let mut package_dirs = BTreeSet::new(); 120 for spec in package_specs() { 121 if FORBIDDEN_PACKAGE_NAMES.contains(&spec.package_name) { 122 return Err(format!( 123 "forbidden package in matrix: {}", 124 spec.package_name 125 )); 126 } 127 if !crate_names.insert(spec.crate_name) { 128 return Err(format!("duplicate crate in matrix: {}", spec.crate_name)); 129 } 130 if !package_names.insert(spec.package_name) { 131 return Err(format!( 132 "duplicate package in matrix: {}", 133 spec.package_name 134 )); 135 } 136 if !package_dirs.insert(spec.package_dir) { 137 return Err(format!( 138 "duplicate package directory in matrix: {}", 139 spec.package_dir 140 )); 141 } 142 } 143 for spec in wasm_package_specs() { 144 if FORBIDDEN_PACKAGE_NAMES.contains(&spec.package_name) { 145 return Err(format!( 146 "forbidden package in matrix: {}", 147 spec.package_name 148 )); 149 } 150 if !crate_names.insert(spec.crate_name) { 151 return Err(format!("duplicate crate in matrix: {}", spec.crate_name)); 152 } 153 if !package_names.insert(spec.package_name) { 154 return Err(format!( 155 "duplicate package in matrix: {}", 156 spec.package_name 157 )); 158 } 159 if !package_dirs.insert(spec.package_dir) { 160 return Err(format!( 161 "duplicate package directory in matrix: {}", 162 spec.package_dir 163 )); 164 } 165 } 166 Ok(()) 167 } 168 169 #[cfg(test)] 170 mod tests { 171 use super::{ 172 FORBIDDEN_PACKAGE_NAMES, package_specs, validate_package_matrix, wasm_package_specs, 173 }; 174 175 #[test] 176 fn package_matrix_is_valid() { 177 validate_package_matrix().expect("package matrix is valid"); 178 } 179 180 #[test] 181 fn approved_package_count_is_stable() { 182 assert_eq!(package_specs().len(), 7); 183 assert_eq!(wasm_package_specs().len(), 3); 184 } 185 186 #[test] 187 fn forbidden_names_are_absent() { 188 for spec in package_specs() { 189 assert!(!FORBIDDEN_PACKAGE_NAMES.contains(&spec.package_name)); 190 } 191 for spec in wasm_package_specs() { 192 assert!(!FORBIDDEN_PACKAGE_NAMES.contains(&spec.package_name)); 193 } 194 } 195 196 #[test] 197 fn replica_schema_package_uses_current_name() { 198 assert!( 199 package_specs() 200 .iter() 201 .any(|spec| spec.package_name == "@radroots/replica-db-schema-bindings") 202 ); 203 } 204 205 #[test] 206 fn wasm_packages_use_sdk_package_names() { 207 assert!( 208 wasm_package_specs() 209 .iter() 210 .any(|spec| spec.package_name == "@radroots/replica-db-wasm") 211 ); 212 } 213 }