Skip to main content

oxibrain_cli/cmd/
token.rs

1use 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    };
20    let (info, secret) = brain.issue_token(&scope, "cli", label).await?;
21    println!("issued token id={}", info.id);
22    println!("label: {:?}", info.label);
23    println!("issued_by: {}", info.issued_by);
24    println!("issued_at: {}", info.issued_at.millis());
25    println!("revoked_at: {:?}", info.revoked_at);
26    println!("secret (shown once): {secret}");
27    Ok(())
28}
29
30pub async fn run_list(dir: &Path) -> anyhow::Result<()> {
31    let brain = Brain::open(BrainConfig::at(dir)).await?;
32    let tokens = brain.list_tokens().await?;
33    println!("tokens: {}", tokens.len());
34    for t in &tokens {
35        let status = if t.revoked_at.is_some() {
36            "revoked"
37        } else {
38            "active"
39        };
40        let caps: Vec<&str> = t.scope.caps.iter().map(|c| c.as_str()).collect();
41        println!(
42            "  [{}] id={} label={:?} issued_by={} spaces={:?} caps={:?}",
43            status, t.id, t.label, t.issued_by, t.scope.spaces, caps,
44        );
45    }
46    Ok(())
47}
48
49pub async fn run_revoke(dir: &Path, id: &str) -> anyhow::Result<()> {
50    let brain = Brain::open(BrainConfig::at(dir)).await?;
51    brain.revoke_token(id).await?;
52    println!("revoked token {id}");
53    Ok(())
54}