oxibrain_cli/cmd/
token.rs1use oxibrain::{Brain, BrainConfig, Capability, Scope};
2use std::path::Path;
3
4pub async fn run_issue(
5 dir: &Path,
6 space: &str,
7 caps: &str,
8 label: Option<&str>,
9) -> anyhow::Result<()> {
10 let brain = Brain::open(BrainConfig::at(dir)).await?;
11 let space_id = brain.ensure_space(space).await?;
12 let caps_set = Capability::parse_set(caps);
13 let scope = Scope {
14 spaces: vec![space_id],
15 caps: caps_set,
16 predicate_filter: None,
17 entity_type_filter: None,
18 expires_at: None,
19 label: String::new(),
20 };
21 let (info, secret) = brain.issue_token(&scope, "cli", label).await?;
22 println!("issued token id={}", info.id);
23 println!("label: {:?}", info.label);
24 println!("issued_by: {}", info.issued_by);
25 println!("issued_at: {}", info.issued_at.millis());
26 println!("revoked_at: {:?}", info.revoked_at);
27 println!("secret (shown once): {secret}");
28 Ok(())
29}
30
31pub async fn run_list(dir: &Path) -> anyhow::Result<()> {
32 let brain = Brain::open(BrainConfig::at(dir)).await?;
33 let tokens = brain.list_tokens().await?;
34 println!("tokens: {}", tokens.len());
35 for t in &tokens {
36 let status = if t.revoked_at.is_some() {
37 "revoked"
38 } else {
39 "active"
40 };
41 let caps: Vec<&str> = t.scope.caps.iter().map(|c| c.as_str()).collect();
42 println!(
43 " [{}] id={} label={:?} issued_by={} spaces={:?} caps={:?}",
44 status, t.id, t.label, t.issued_by, t.scope.spaces, caps,
45 );
46 }
47 Ok(())
48}
49
50pub async fn run_revoke(dir: &Path, id: &str) -> anyhow::Result<()> {
51 let brain = Brain::open(BrainConfig::at(dir)).await?;
52 brain.revoke_token(id).await?;
53 println!("revoked token {id}");
54 Ok(())
55}