use std::time::{Duration, SystemTime};
fn main() -> anyhow::Result<()> {
let key = moq_token::Key::generate(moq_token::Algorithm::HS256, Some(moq_token::KeyId::random()))?;
let key_str = key.to_str()?;
println!("Generated key:\n{key_str}\n");
let claims = moq_token::Claims::default()
.with_root("demo")
.with_publish(["my-stream"]) .with_subscribe([""]) .with_expires(SystemTime::now() + Duration::from_secs(3600))
.with_issued(SystemTime::now());
claims.validate()?;
let token = key.sign(&claims)?;
println!("Signed token:\n{token}\n");
let verified = key.verify(&token)?;
println!("Verified claims:");
println!(" root: {}", verified.root);
println!(" publish: {:?}", verified.publish);
println!(" subscribe: {:?}", verified.subscribe);
let permissions = verified.authorize("demo/my-stream")?;
println!("\nPermissions at demo/my-stream:");
println!(" publish: {:?}", permissions.publish);
println!(" subscribe: {:?}", permissions.subscribe);
let loaded = moq_token::Key::from_str(&key_str)?;
let also_verified = loaded.verify(&token)?;
assert_eq!(also_verified.root, verified.root);
println!("\nKey round-trip successful!");
Ok(())
}