use rocketmq_auth::AuthConfig;
use rocketmq_auth::AuthorizationDecision;
use rocketmq_auth::AuthorizationEvaluator;
use rocketmq_auth::DefaultAuthorizationContext;
use rocketmq_auth::PolicyResource;
use rocketmq_auth::StatelessAuthorizationStrategy;
use rocketmq_security_api::Action;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = AuthConfig::default();
let strategy = StatelessAuthorizationStrategy::new(config, None)?;
let evaluator = AuthorizationEvaluator::new(strategy);
let mut contexts = Vec::new();
let mut context1 = DefaultAuthorizationContext::default();
context1.set_resource(PolicyResource::of_topic("test-topic"));
context1.set_actions(vec![Action::Pub]);
context1.set_source_ip("192.168.1.100");
context1.set_rpc_code("10");
contexts.push(context1);
let mut context2 = DefaultAuthorizationContext::default();
context2.set_resource(PolicyResource::of_group("test-group".to_string()));
context2.set_actions(vec![Action::Sub]);
context2.set_source_ip("192.168.1.100");
context2.set_rpc_code("11");
contexts.push(context2);
match evaluator.evaluate(&contexts).await {
Ok(AuthorizationDecision::Allow) => println!("✓ Authorization allowed for all contexts"),
Ok(AuthorizationDecision::Deny(denial)) => {
println!("✗ Authorization denied: {:?}", denial)
}
Err(e) => println!("✗ Authorization evaluation failed: {}", e),
}
let empty_contexts: Vec<DefaultAuthorizationContext> = vec![];
assert_eq!(evaluator.evaluate(&empty_contexts).await?, AuthorizationDecision::Allow);
println!("✓ Empty contexts evaluation succeeded (fast path)");
Ok(())
}