Skip to main content

rto_render/
lib.rs

1//! Renderers over the Roteiro graph. All outputs — docs site, Obsidian vault,
2//! and the optional MCP server (feature `mcp`) — are build products of the
3//! same store, so humans and agents always see the same data.
4
5mod docs;
6mod obsidian;
7/// The one place each shared tool description is written (#590).
8pub mod tool_text;
9
10#[cfg(feature = "mcp")]
11pub mod mcp;
12
13pub use docs::{
14    IndexEntry, NavEntry, PublishedPages, RenderedAdr, SourceBase, markdown_to_html, render_adr,
15    render_adr_index, render_doc, render_nav, render_site_page, replace_site_nav,
16};
17pub use obsidian::{
18    AdrEntry, ConfigSecretSummary, CouplingEntry, Coverage, CrossLink, DensityEntry, FindingEntry,
19    HOME_NOTE, MemberPin, RenderedUnder, VaultNote, VaultScope, VaultSummary, WorkspaceSummary,
20    note_name, render_home, render_note, render_note_scoped, render_workspace_home,
21    scoped_note_name,
22};
23
24/// A render target for the graph.
25#[derive(Debug, Clone, Copy, PartialEq, Eq)]
26pub enum Target {
27    /// Static documentation website (ADRs, blueprints, AI context pages).
28    DocsSite,
29    /// Obsidian-compatible markdown vault.
30    ObsidianVault,
31}
32
33impl Target {
34    /// Stable CLI name for this target.
35    #[must_use]
36    pub fn as_str(self) -> &'static str {
37        match self {
38            Self::DocsSite => "docs",
39            Self::ObsidianVault => "obsidian",
40        }
41    }
42
43    /// Parse a target from its CLI name.
44    #[must_use]
45    pub fn parse(s: &str) -> Option<Self> {
46        match s {
47            "docs" => Some(Self::DocsSite),
48            "obsidian" => Some(Self::ObsidianVault),
49            _ => None,
50        }
51    }
52}
53
54#[cfg(test)]
55mod tests {
56    use super::Target;
57
58    #[test]
59    fn target_names_are_stable() {
60        assert_eq!(Target::DocsSite.as_str(), "docs");
61        assert_eq!(Target::ObsidianVault.as_str(), "obsidian");
62        assert_eq!(Target::parse("docs"), Some(Target::DocsSite));
63        assert_eq!(Target::parse("obsidian"), Some(Target::ObsidianVault));
64        assert_eq!(Target::parse("nope"), None);
65    }
66}