lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README

commit 90cc25893d2105fed3ca142958e4b15fb72cc22c
parent 0fb42cc9b6d618a4ac1e6b563501d10c4d4a76f7
Author: triesap <tyson@radroots.org>
Date:   Mon,  3 Aug 2026 12:54:37 +0000

facade: add ordinary and advanced smoke examples

- Add a minimal ordinary memory facade example with inert local-only defaults.
- Preserve the advanced SDK composition examples as the separate host front door.
- Run both front doors as independent clean temporary Cargo projects.
- Cover smoke manifests, local crate patches, and resolved toolchain execution.

Diffstat:
Mcrates/radroots/Cargo.toml | 5+++++
Acrates/radroots/examples/ordinary_memory.rs | 10++++++++++
Mtools/sdk_xtask_import/src/main.rs | 2+-
Mtools/sdk_xtask_import/src/smoke.rs | 121++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------
4 files changed, 121 insertions(+), 17 deletions(-)

diff --git a/crates/radroots/Cargo.toml b/crates/radroots/Cargo.toml @@ -10,6 +10,7 @@ homepage.workspace = true authors.workspace = true readme = "README.md" publish = false +autoexamples = false [lints] workspace = true @@ -36,3 +37,7 @@ radrootsd = ["client", "radroots_sdk/radrootsd"] geonames = ["client", "radroots_sdk/geonames"] knowledge = ["client", "radroots_sdk/knowledge"] full = ["radroots_sdk/full"] + +[[example]] +name = "ordinary_memory" +path = "examples/ordinary_memory.rs" diff --git a/crates/radroots/examples/ordinary_memory.rs b/crates/radroots/examples/ordinary_memory.rs @@ -0,0 +1,10 @@ +//! Constructs the ordinary, safe, local-only Radroots front door. + +fn main() -> radroots::Result<()> { + let client = radroots::client::memory().build()?; + let profile = radroots::client::local_only(); + + assert!(!client.is_closed()); + assert!(profile.is_local_only()); + Ok(()) +} diff --git a/tools/sdk_xtask_import/src/main.rs b/tools/sdk_xtask_import/src/main.rs @@ -90,7 +90,7 @@ fn command_action(args: &[String]) -> Result<CommandAction<'_>, String> { } fn usage() -> String { - "usage: cargo xtask architecture | cargo xtask architecture-ci | cargo xtask check-api-boundaries | cargo xtask check-dependency-boundaries | cargo xtask generate | cargo xtask generate ts | cargo xtask generate wasm [--package <key>] | cargo xtask generate package-metadata | cargo xtask check | cargo xtask smoke sdk-rust-local | cargo xtask coverage run" + "usage: cargo xtask architecture | cargo xtask architecture-ci | cargo xtask check-api-boundaries | cargo xtask check-dependency-boundaries | cargo xtask generate | cargo xtask generate ts | cargo xtask generate wasm [--package <key>] | cargo xtask generate package-metadata | cargo xtask check | cargo xtask smoke facade-rust-local | sdk-rust-local | front-doors-rust-local | cargo xtask coverage run" .to_owned() } diff --git a/tools/sdk_xtask_import/src/smoke.rs b/tools/sdk_xtask_import/src/smoke.rs @@ -8,38 +8,98 @@ use crate::{ pub fn run(args: &[String]) -> Result<(), String> { match args { [target] if target == "sdk-rust-local" => sdk_rust_local(), - _ => Err("usage: cargo xtask smoke sdk-rust-local".to_owned()), + [target] if target == "facade-rust-local" => facade_rust_local(), + [target] if target == "front-doors-rust-local" => { + facade_rust_local()?; + sdk_rust_local() + } + _ => Err( + "usage: cargo xtask smoke facade-rust-local | sdk-rust-local | front-doors-rust-local" + .to_owned(), + ), } } +fn facade_rust_local() -> Result<(), String> { + let root = workspace_root()?; + let facade_path = root.join("crates/radroots"); + let lib_root = sibling_lib_root(&root)?; + let toolchain = resolve_rust_toolchain(&root)?; + run_clean_consumer( + "facade", + &render_facade_consumer_manifest(&facade_path, &lib_root)?, + FACADE_CONSUMER_MAIN, + &toolchain, + ) +} + fn sdk_rust_local() -> Result<(), String> { let root = workspace_root()?; let sdk_path = root.join("crates/sdk"); - let lib_root = root + let lib_root = sibling_lib_root(&root)?; + let toolchain = resolve_rust_toolchain(&root)?; + run_clean_consumer( + "SDK", + &render_sdk_consumer_manifest(&sdk_path, &lib_root)?, + SDK_CONSUMER_MAIN, + &toolchain, + ) +} + +fn sibling_lib_root(root: &Path) -> Result<std::path::PathBuf, String> { + Ok(root .parent() .ok_or_else(|| format!("{} has no repository parent", root.display()))? - .join("lib"); - let toolchain = resolve_rust_toolchain(&root)?; + .join("lib")) +} + +fn run_clean_consumer( + label: &str, + manifest: &str, + main: &str, + toolchain: &ResolvedRustToolchain, +) -> Result<(), String> { let tempdir = tempfile::tempdir().map_err(|error| format!("failed to create smoke tempdir: {error}"))?; - let manifest = render_sdk_consumer_manifest(&sdk_path, &lib_root)?; fs::write(tempdir.path().join("Cargo.toml"), manifest) - .map_err(|error| format!("failed to write SDK smoke manifest: {error}"))?; + .map_err(|error| format!("failed to write {label} smoke manifest: {error}"))?; let src_dir = tempdir.path().join("src"); fs::create_dir_all(&src_dir) .map_err(|error| format!("failed to create {}: {error}", src_dir.display()))?; - fs::write(src_dir.join("main.rs"), SDK_CONSUMER_MAIN) - .map_err(|error| format!("failed to write SDK smoke consumer: {error}"))?; - let status = smoke_cargo_check_command(tempdir.path(), &toolchain) + fs::write(src_dir.join("main.rs"), main) + .map_err(|error| format!("failed to write {label} smoke consumer: {error}"))?; + let status = smoke_cargo_run_command(tempdir.path(), toolchain) .status() - .map_err(|error| format!("failed to run SDK smoke cargo check: {error}"))?; + .map_err(|error| format!("failed to run {label} smoke consumer: {error}"))?; if status.success() { Ok(()) } else { - Err(format!("SDK Rust local smoke failed with status {status}")) + Err(format!( + "{label} Rust local smoke failed with status {status}" + )) } } +fn render_facade_consumer_manifest(facade_path: &Path, lib_root: &Path) -> Result<String, String> { + let facade_path = serde_json::to_string(&facade_path.to_string_lossy()) + .map_err(|error| format!("failed to render facade path: {error}"))?; + let mut manifest = format!( + r#"[package] +name = "radroots_facade_host_smoke" +version = "0.1.0" +edition = "2024" +publish = false + +[dependencies] +radroots = {{ path = {facade_path} }} + +[patch.crates-io] +"#, + ); + append_lib_patches(&mut manifest, lib_root)?; + Ok(manifest) +} + fn render_sdk_consumer_manifest(sdk_path: &Path, lib_root: &Path) -> Result<String, String> { let sdk_path = serde_json::to_string(&sdk_path.to_string_lossy()) .map_err(|error| format!("failed to render SDK path: {error}"))?; @@ -56,6 +116,11 @@ radroots_sdk = {{ path = {sdk_path}, default-features = true }} [patch.crates-io] "#, ); + append_lib_patches(&mut manifest, lib_root)?; + Ok(manifest) +} + +fn append_lib_patches(manifest: &mut String, lib_root: &Path) -> Result<(), String> { for (package, relative_path) in [ ("radroots_blossom", "crates/blossom"), ("radroots_core", "crates/core"), @@ -79,12 +144,12 @@ radroots_sdk = {{ path = {sdk_path}, default-features = true }} .map_err(|error| format!("failed to render {package} patch path: {error}"))?; manifest.push_str(&format!("{package} = {{ path = {path} }}\n")); } - Ok(manifest) + Ok(()) } -fn smoke_cargo_check_command(path: &Path, toolchain: &ResolvedRustToolchain) -> Command { +fn smoke_cargo_run_command(path: &Path, toolchain: &ResolvedRustToolchain) -> Command { let mut command = Command::new(&toolchain.cargo); - command.arg("check").arg("--quiet").current_dir(path); + command.arg("run").arg("--quiet").current_dir(path); toolchain.apply_to_command(&mut command); command } @@ -100,13 +165,23 @@ fn main() { } "#; +const FACADE_CONSUMER_MAIN: &str = r#"fn main() -> radroots::Result<()> { + let client = radroots::client::memory().build()?; + assert!(!client.is_closed()); + assert!(radroots::client::local_only().is_local_only()); + Ok(()) +} +"#; + #[cfg(test)] mod tests { use std::path::{Path, PathBuf}; use crate::wasm::ResolvedRustToolchain; - use super::{render_sdk_consumer_manifest, run, smoke_cargo_check_command}; + use super::{ + render_facade_consumer_manifest, render_sdk_consumer_manifest, run, smoke_cargo_run_command, + }; #[test] fn retired_sdk_knowledge_smoke_is_not_a_command_surface() { @@ -131,6 +206,19 @@ mod tests { } #[test] + fn facade_smoke_consumer_uses_curated_front_door() { + let manifest = render_facade_consumer_manifest( + Path::new("/tmp/radroots_facade"), + Path::new("/tmp/radroots_lib"), + ) + .expect("manifest"); + + assert!(manifest.contains("name = \"radroots_facade_host_smoke\"")); + assert!(manifest.contains("radroots = { path = \"/tmp/radroots_facade\" }")); + assert!(!manifest.contains("radroots_sdk = { path")); + } + + #[test] fn smoke_command_uses_resolved_cargo_path() { let cargo = PathBuf::from("/tmp/rust-toolchain/bin/cargo"); let toolchain = ResolvedRustToolchain { @@ -140,8 +228,9 @@ mod tests { bin_dir: PathBuf::from("/tmp/rust-toolchain/bin"), }; - let command = smoke_cargo_check_command(Path::new("/tmp/smoke"), &toolchain); + let command = smoke_cargo_run_command(Path::new("/tmp/smoke"), &toolchain); assert_eq!(command.get_program(), cargo.as_os_str()); + assert_eq!(command.get_args().next(), Some(std::ffi::OsStr::new("run"))); } }