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:
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")));
}
}