Skip to main content

release_kit/commands/
forge.rs

1//! `rk forge`: read the per-forge documents, the siblings of the bindings.
2
3use crate::cli::read::ReadArgs;
4use crate::commands::walk;
5use crate::embedded;
6use crate::error::RkError;
7use crate::output::Output;
8
9/// Print one forge document byte-identically, or list the forges.
10///
11/// # Errors
12///
13/// Returns [`RkError::NotFound`] for an unknown forge and
14/// [`RkError::Usage`] when neither a name nor `--list` is given.
15pub fn run(args: &ReadArgs) -> Result<(), RkError> {
16    let out = Output::human();
17    let entries = walk(&embedded::FORGES);
18    if args.list {
19        for (path, _) in &entries {
20            out.result_line(path.trim_end_matches(".md").to_ascii_lowercase());
21        }
22        return Ok(());
23    }
24    let Some(name) = args.name.as_deref() else {
25        return Err(RkError::Usage(
26            "name a forge, or pass --list to see them".into(),
27        ));
28    };
29    let wanted = name.to_ascii_lowercase();
30    let wanted = wanted.trim_end_matches(".md");
31    entries
32        .iter()
33        .find(|(path, _)| path.trim_end_matches(".md").eq_ignore_ascii_case(wanted))
34        .map_or_else(
35            || {
36                Err(RkError::NotFound {
37                    kind: "forge",
38                    name: name.to_owned(),
39                })
40            },
41            |(_, contents)| {
42                out.result_raw(&String::from_utf8_lossy(contents));
43                Ok(())
44            },
45        )
46}