aboutsummaryrefslogtreecommitdiff
path: root/mingling_core/src/program/config.rs
blob: c3b1b0e9476964718a00b324cb6ced68e2249489 (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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/// Program stdout settings
#[derive(Debug, Clone)]
pub struct ProgramStdoutSetting {
    /// Output error messages
    pub error_output: bool,

    /// Render results and output
    pub render_output: bool,

    /// Silence panic messages
    pub silence_panic: bool,

    #[cfg(feature = "clap")]
    /// Behavior when Clap Dispatcher outputs help information
    pub clap_help_print_behaviour: ClapHelpPrintBehaviour,
}

#[cfg(feature = "clap")]
#[derive(Debug, Default, Clone)]
pub enum ClapHelpPrintBehaviour {
    /// Write to RenderResult
    WriteToRenderResult,

    /// Print directly
    #[default]
    PrintDirectly,
}

impl Default for ProgramStdoutSetting {
    fn default() -> Self {
        ProgramStdoutSetting {
            error_output: true,
            render_output: true,
            silence_panic: false,
            #[cfg(feature = "clap")]
            clap_help_print_behaviour: ClapHelpPrintBehaviour::default(),
        }
    }
}

/// Program user context
#[derive(Debug, Clone)]
pub struct ProgramUserContext {
    /// View help information instead of running the command
    pub help: bool,

    /// Skip user confirmation step
    pub confirm: bool,

    /// Execute hooks during the program lifecycle
    pub run_hook: bool,
}

impl Default for ProgramUserContext {
    fn default() -> Self {
        Self {
            help: false,
            confirm: false,
            run_hook: true,
        }
    }
}

#[cfg(feature = "general_renderer")]
#[derive(Debug, Clone, Default)]
/// Settings for the general renderer output format.
///
/// Controls how structured data (e.g., JSON, YAML, TOML) is rendered to stdout.
pub enum GeneralRendererSetting {
    /// Do not render structured output (use default formatting).
    #[default]
    Disable,
    /// Render output as compact JSON.
    Json,
    /// Render output as pretty-printed JSON.
    JsonPretty,
    /// Render output as YAML.
    Yaml,
    /// Render output as TOML.
    Toml,
    /// Render output as RON.
    Ron,
    /// Render output as pretty-printed RON.
    RonPretty,
}

#[cfg(feature = "general_renderer")]
impl std::str::FromStr for GeneralRendererSetting {
    type Err = String;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        match just_fmt::kebab_case!(s).as_str() {
            "disable" => Ok(GeneralRendererSetting::Disable),
            "json" => Ok(GeneralRendererSetting::Json),
            "json-pretty" => Ok(GeneralRendererSetting::JsonPretty),
            "yaml" => Ok(GeneralRendererSetting::Yaml),
            "toml" => Ok(GeneralRendererSetting::Toml),
            "ron" => Ok(GeneralRendererSetting::Ron),
            "ron-pretty" => Ok(GeneralRendererSetting::RonPretty),
            _ => Err(format!("Invalid renderer: '{}'", s)),
        }
    }
}

#[cfg(feature = "general_renderer")]
impl From<&str> for GeneralRendererSetting {
    fn from(s: &str) -> Self {
        s.parse().unwrap_or(GeneralRendererSetting::Disable)
    }
}

#[cfg(feature = "general_renderer")]
impl From<String> for GeneralRendererSetting {
    fn from(s: String) -> Self {
        s.as_str().into()
    }
}

#[cfg(feature = "general_renderer")]
impl std::fmt::Display for GeneralRendererSetting {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            GeneralRendererSetting::Disable => write!(f, "disable"),
            GeneralRendererSetting::Json => write!(f, "json"),
            GeneralRendererSetting::JsonPretty => write!(f, "json-pretty"),
            GeneralRendererSetting::Yaml => write!(f, "yaml"),
            GeneralRendererSetting::Toml => write!(f, "toml"),
            GeneralRendererSetting::Ron => write!(f, "ron"),
            GeneralRendererSetting::RonPretty => write!(f, "ron-pretty"),
        }
    }
}