//! Write single-threaded WASI plugins for Sausage. //! //! Each core call starts a process. Keep its initial value cheap to construct. //! Declare documented parameter and result types with [`macro@schema`]. //! Declare methods with [`macro@rpc`], then serve them with [`run`]. //! //! ```no_run //! use sausage_plugin::{rpc, schema, Result}; //! struct Calculator; //! /// The numbers to add. //! #[schema] //! struct AddParams { //! /// The first number. //! a: i32, //! /// The second number. //! b: i32, //! } //! #[rpc] //! impl Calculator { //! /// Add two numbers. //! fn add(&self, p: AddParams) -> Result { Ok(p.a + p.b) } //! } //! fn main() { sausage_plugin::run(Calculator); } //! ``` //! //! Use [`call`] for outgoing calls. Await its builder for the JSON result. //! Use `detach()` to detach the child and `on_notify(f)` to receive progress. //! Use [`Ctx::notify`] to report progress to your caller. //! Use [`Ctx::exit_after_response`] to end the process after the response. //! //! [`background`] keeps the process alive while a task runs. //! At stdin EOF, pending calls fail and the optional [`macro@on_stop`] hook runs. //! The stop hook can write files and send notifications, but cannot make calls. //! [`macro@on_retired`] handles `rpc.retired` after an upgrade. //! //! Use [`lock`] before shared state changes. A guard releases its lock on drop. //! `try_now()` returns a guard whose `held()` method reports success. //! `keep()` retains a lock until process exit. //! [`state_dir`], [`write_atomic`], and [`pid`] provide filesystem and identity helpers. //! Use [`macro@test`] for async tests. Native tests fail clearly without a core transport. //! [`macro@import`] reads `imports/.json` and generates a private typed client. //! Its functions return [`TypedCall`] builders with progress and detach options. //! Declare endpoint types with `#[rpc(endpoints(control = Control))]`. //! [`listen`] publishes a declared interface at an endpoint file. //! [`connect`] verifies its owner before it returns an [`Endpoint`]. //! Endpoint calls report progress through [`EndpointCall::on_notify`]. //! Log with `eprintln!`. Stdout belongs to JSON-RPC. #![warn(missing_docs)] mod discovery; mod endpoints; mod error; mod helpers; mod imports; mod lines; mod transport; pub use discovery::*; pub use endpoints::*; pub use error::*; pub use helpers::*; pub use imports::*; #[doc(hidden)] pub use inventory; pub use sausage_plugin_macros::{import, on_retired, on_stop, rpc, schema, test}; pub use transport::*; pub use {schemars, serde, serde_json};