release_kit/commands/
read.rs1use include_dir::Dir;
4
5use crate::cli::read::ReadArgs;
6use crate::commands::walk;
7use crate::embedded;
8use crate::error::RkError;
9use crate::output::Output;
10
11pub fn method(args: &ReadArgs) -> Result<(), RkError> {
18 flat(&embedded::METHOD, "chapter", args)
19}
20
21pub fn binding(args: &ReadArgs) -> Result<(), RkError> {
28 flat(&embedded::BINDINGS, "binding", args)
29}
30
31pub fn snippet(args: &ReadArgs) -> Result<(), RkError> {
38 let out = Output::human();
39 let entries = walk(&embedded::SNIPPETS);
40 if args.list {
41 for (path, _) in &entries {
42 out.result_line(path);
43 }
44 return Ok(());
45 }
46 let Some(name) = args.name.as_deref() else {
47 return Err(RkError::Usage(
48 "name a snippet path, or pass --list to see them".into(),
49 ));
50 };
51 entries.iter().find(|(path, _)| path == name).map_or_else(
52 || {
53 Err(RkError::NotFound {
54 kind: "snippet",
55 name: name.to_owned(),
56 })
57 },
58 |(_, contents)| {
59 print_bytes(out, contents);
60 Ok(())
61 },
62 )
63}
64
65fn flat(dir: &Dir<'static>, kind: &'static str, args: &ReadArgs) -> Result<(), RkError> {
70 let out = Output::human();
71 let entries = walk(dir);
72 if args.list {
73 for (path, _) in &entries {
74 out.result_line(short_key(path));
75 }
76 return Ok(());
77 }
78 let Some(name) = args.name.as_deref() else {
79 return Err(RkError::Usage(format!(
80 "name a {kind}, or pass --list to see them"
81 )));
82 };
83 let wanted = name.to_ascii_lowercase();
84 let wanted = wanted.trim_end_matches(".md");
85 for (path, contents) in &entries {
86 let stem = path.trim_end_matches(".md");
87 if stem.eq_ignore_ascii_case(wanted) || short_key(path) == wanted {
88 print_bytes(out, contents);
89 return Ok(());
90 }
91 }
92 Err(RkError::NotFound {
93 kind,
94 name: name.to_owned(),
95 })
96}
97
98fn short_key(path: &str) -> String {
101 let stem = path.trim_end_matches(".md");
102 let stem = stem
103 .split_once('-')
104 .filter(|(prefix, _)| prefix.chars().all(|c| c.is_ascii_digit()))
105 .map_or(stem, |(_, rest)| rest);
106 stem.to_ascii_lowercase()
107}
108
109fn print_bytes(out: Output, contents: &[u8]) {
111 out.result_raw(&String::from_utf8_lossy(contents));
112}