aboutsummaryrefslogtreecommitdiff
path: root/mling/src/cli.rs
blob: b628021a3d4802e6479d3b06f469e3b803566367 (plain) (blame)
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
use mingling::{
    macros::{r_println, renderer},
    setup::{BasicProgramSetup, GeneralRendererSetup},
};

use crate::{CMDCompletion, ErrorDispatcherNotFound, ThisProgram, display::markdown};

pub mod list;
pub use list::*;

pub mod namespace_mgr;
pub use namespace_mgr::*;

pub mod read;
pub use read::*;

pub mod install;
pub use install::*;

/// Entry point for the CLI application.
///
/// # Panics
///
/// Panics on Windows if the virtual terminal processing cannot be enabled.
pub fn cli_entry() {
    let mut program = ThisProgram::new();

    // Plugins
    program.with_setup(BasicProgramSetup);
    program.with_setup(GeneralRendererSetup);
    program.with_dispatcher(CMDCompletion);

    if program.pick_global_flag(["-v", "--version"]) {
        println!("{}", include_str!("../res/version.txt").trim_end());
        return;
    }

    // Help
    if program.user_context.help {
        println!(
            "{}",
            markdown(include_str!("../res/help-mling.txt").trim_end())
        );
        return;
    }

    // Context query commands
    program.with_dispatcher(ListInstalledCommand);
    program.with_dispatchers((
        ReadTargetDirCommand,
        ReadWorkspaceRootCommand,
        ReadBinariesCommand,
    ));

    // Namespace manage commands
    program.with_dispatchers((
        TrustNamespaceCommand,
        UntrustNamespaceCommand,
        SetTrustNamespaceCommand,
        RemoveNamespaceCommand,
    ));

    // Install binaries command
    program.with_dispatcher(InstallCommand);

    // Colored Setup
    #[cfg(windows)]
    colored::control::set_virtual_terminal(true).unwrap();

    let _ = program.exec();
}

#[renderer]
pub(crate) fn fallback_disp(prev: ErrorDispatcherNotFound) {
    r_println!("Error: command \"{}\" not found!", prev.join(" "));
    r_println!("Use \"mling --help\" for more information.");
}