sdk

Radroots SDK and bindings
git clone https://radroots.dev/git/sdk.git
Log | Files | Refs | README

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 }