Skip to main content

oxibrain_cli/cmd/
page.rs

1use oxibrain::{Brain, BrainConfig, BriefTarget};
2use std::path::Path;
3
4/// `oxibrain page <entity> [--kind entity|space|topic] [--topic <kw>]`
5/// — render a brief page to stdout (ARCHITECTURE.md §16.4, M9 §14.1).
6/// `--kind entity` (default) renders an entity page; `--kind space` renders
7/// a space overview; `--kind topic <kw>` keyword-searches entity surfaces.
8pub async fn run(
9    dir: &Path,
10    entity: Option<&str>,
11    space: &str,
12    kind: &str,
13    topic: Option<&str>,
14) -> anyhow::Result<()> {
15    let brain = Brain::open(BrainConfig::at(dir)).await?;
16    let space_id = brain.ensure_space(space).await?;
17    let page = match kind {
18        "entity" => {
19            let id = entity
20                .ok_or_else(|| anyhow::anyhow!("page: --kind entity requires an entity id"))?;
21            brain.brief(&space_id, id).await?
22        }
23        "space" => brain.brief_target(&space_id, BriefTarget::Space).await?,
24        "topic" => {
25            let t = topic
26                .ok_or_else(|| anyhow::anyhow!("page: --kind topic requires --topic <keyword>"))?;
27            brain.brief_target(&space_id, BriefTarget::Topic(t)).await?
28        }
29        other => anyhow::bail!("page: --kind '{other}' (expected entity|space|topic)"),
30    };
31    println!("{page}");
32    Ok(())
33}