Unnamed repository; edit this file 'description' to name the repository.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
use std::env;

pub mod md_gen {
    use super::path;
    use std::fs;

    use helix_term::commands::cmd::TYPABLE_COMMAND_LIST;

    pub const TYPABLE_COMMANDS_MD_OUTPUT: &str = "typable-cmd.md";

    pub fn typable_commands() -> String {
        let mut md = String::new();
        md.push_str("| Name | Description |\n");
        md.push_str("| ---  | ---         |\n");

        let cmdify = |s: &str| format!("`:{}`", s);

        for cmd in TYPABLE_COMMAND_LIST {
            let names = std::iter::once(&cmd.name)
                .chain(cmd.aliases.iter())
                .map(|a| cmdify(a))
                .collect::<Vec<_>>()
                .join(", ");

            let entry = format!("| {} | {} |\n", names, cmd.doc);
            md.push_str(&entry);
        }

        md
    }

    pub fn write(filename: &str, data: &str) {
        let error = format!("Could not write to {}", filename);
        let path = path::book_gen().join(filename);
        fs::write(path, data).expect(&error);
    }
}

pub mod path {
    use std::path::{Path, PathBuf};

    pub fn project_root() -> PathBuf {
        Path::new(env!("CARGO_MANIFEST_DIR"))
            .parent()
            .unwrap()
            .to_path_buf()
    }

    pub fn book_gen() -> PathBuf {
        project_root().join("book/src/generated/")
    }
}

pub mod tasks {
    use super::md_gen;

    pub fn bookgen() {
        md_gen::write(
            md_gen::TYPABLE_COMMANDS_MD_OUTPUT,
            &md_gen::typable_commands(),
        );
    }

    pub fn print_help() {
        println!(
            "
Usage: Run with `cargo xtask <task>`, eg. `cargo xtask bookgen`.

    Tasks:
        bookgen: Generate files to be included in the mdbook output.
"
        );
    }
}

fn main() -> Result<(), String> {
    let task = env::args().nth(1);
    match task {
        None => tasks::print_help(),
        Some(t) => match t.as_str() {
            "bookgen" => tasks::bookgen(),
            invalid => return Err(format!("Invalid task name: {}", invalid)),
        },
    };
    Ok(())
}