Rust Examples
Provider with Storage
use saikuro::{Provider, Client, Value};
use saikuro::storage::{create_transient_storage, KeyValueBackend};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut provider = Provider::new("kv");
provider
.register("get", |args| {
let key: String = args.get(0)?;
let storage = create_transient_storage()?;
let val = storage.get("kv", &key).await?;
Ok(val.map(|v| Value::Bytes(v.to_vec())).unwrap_or(Value::Unit))
})
.await?;
provider.serve("unix:///tmp/saikuro.sock").await?;
Ok(())
}
Testing
use saikuro::{Client, Provider, InMemoryTransport};
#[tokio::test]
async fn test_math() {
let (pt, ct) = InMemoryTransport::pair();
let mut provider = Provider::new("math");
provider
.register("add", |args| {
let a: i32 = args.get(0)?;
let b: i32 = args.get(1)?;
Ok((a + b).into())
})
.await
.unwrap();
tokio::spawn(async move { provider.serve_on(pt).await });
let mut client = Client::open_on(ct).await.unwrap();
let result: i32 = client.call("math.add", &[1.into(), 2.into()]).await.unwrap();
assert_eq!(result, 3);
}