The Rust SDK needs Rust 1.75 or later. It is async on tokio and reqwest (rustls); the blocking feature adds the blocking client used below. Crate: speedle 0.1.0 on crates.io. Reference: speedle-sdk/rust.
The examples check the policy described in SDKs.
Add the dependency
In a new package:
cargo new speedle-example
cd speedle-example
cargo add speedle@0.1.0 --features blockingCall a local Speedle
Start Speedle and create the example policy as described in SDKs. Replace src/main.rs with:
use speedle::blocking::Client;
use speedle::{Auth, Backend};
fn main() {
if let Err(e) = run() {
eprintln!("Speedle error: {e}");
std::process::exit(1);
}
}
fn run() -> Result<(), speedle::Error> {
let speedle = Client::builder(Backend::SpeedlePlus, "http://localhost:6734", Auth::none(), "docs").build()?;
let allowed = speedle.is_allowed(&"alice".into(), "get", "/docs/public", &[])?;
println!("alice get /docs/public: allowed={allowed}");
let d = speedle.check(&"alice".into(), "delete", "/docs/public", &[])?;
println!("alice delete /docs/public: allowed={} reason={:?}", d.allowed, d.reason);
Ok(())
}
Run it:
cargo runOutput:
alice get /docs/public: allowed=true
alice delete /docs/public: allowed=false reason=NoApplicablePoliciesCall Speedle Cloud
Speedle Cloud is coming soon.
The program reads the service name from SPEEDLE_SERVICE and the service’s token from SPEEDLE_TOKEN. SPEEDLE_ENDPOINT overrides the default endpoint https://cloud.speedle.io. Replace src/main.rs with:
use std::env;
use speedle::blocking::Client;
use speedle::{Auth, Backend};
fn main() {
if let Err(e) = run() {
eprintln!("Speedle error: {e}");
std::process::exit(1);
}
}
fn run() -> Result<(), speedle::Error> {
let endpoint = env::var("SPEEDLE_ENDPOINT").unwrap_or_else(|_| "https://cloud.speedle.io".to_string());
let token = env::var("SPEEDLE_TOKEN").unwrap_or_default();
let service = env::var("SPEEDLE_SERVICE").unwrap_or_default();
let speedle = Client::builder(Backend::SpeedleCloud, &endpoint, Auth::bearer(token), service).build()?;
let allowed = speedle.is_allowed(&"alice".into(), "get", "/docs/public", &[])?;
println!("alice get /docs/public: allowed={allowed}");
let d = speedle.check(&"alice".into(), "delete", "/docs/public", &[])?;
println!("alice delete /docs/public: allowed={} reason={:?}", d.allowed, d.reason);
Ok(())
}
Set the environment and run it. read -rs keeps the token out of your shell history and screen:
export SPEEDLE_SERVICE=docs
read -rs SPEEDLE_TOKEN && export SPEEDLE_TOKEN
cargo runOutput, when the service has the example policy:
alice get /docs/public: allowed=true
alice delete /docs/public: allowed=false reason=NoApplicablePoliciesThe token is a server-side secret. Never ship it to browsers, mobile apps or desktop clients.