sausage-plugin part 2: import! with typed clients (sausage_interface::client_rs), TCP endpoints with rpc.endpoint, examples

Part 1 fixes: complete stdout writes, buffered stdin, Rust type names
in schemas, enum variant docs, -32603 for serde errors in handlers,
crate docs and modules. End-to-end check of a generated consumer through
a fake core.
This commit is contained in:
2026-10-23 00:35:45 +01:00
parent ae1cb4cc99
commit 8d3c163992
42 changed files with 3020 additions and 856 deletions
+47
View File
@@ -0,0 +1,47 @@
//! Use typed calls from discovered provider documents in `imports/`.
//! Copy fresh documents from `/proc/core/plugins/<provider>/discover.json` after an interface changes.
use sausage_plugin::{Result, rpc, schema};
sausage_plugin::import!("notes");
sausage_plugin::import!("www");
sausage_plugin::import!("secrets");
struct Consumer;
/// The text and HTTP port for this demonstration.
#[schema]
struct DemoParams {
/// The note text to append.
text: String,
/// The port for the detached HTTP server.
port: u16,
}
#[rpc]
impl Consumer {
/// Add a note, start a server, and inspect its control endpoint.
async fn demo(&self, p: DemoParams) -> Result<u64> {
let added = notes::add(notes::AddParams { text: p.text }).await?;
eprintln!("{} notes", added.count);
let pid = www::start(www::StartParams { port: p.port })
.detach()
.await?;
let control = www::control::connect(format!("/proc/{pid}/control")).await?;
control.stats().await
}
/// Store and read a value through the boot service's fixed endpoint.
async fn vault(&self) -> Result<Option<String>> {
let vault = secrets::vault::connect("/run/secrets").await?;
vault
.put(secrets::PutParams {
name: "example".into(),
value: "hello".into(),
})
.on_notify(|name, params| eprintln!("{name}: {params}"))
.await?;
vault
.get(secrets::GetParams {
name: "example".into(),
})
.await
}
}
fn main() {
sausage_plugin::run(Consumer)
}