structopt_flags/
logopt.rs

1use crate::{GetWithDefault, LogLevel};
2use log::LevelFilter;
3use std::fmt;
4use structopt::StructOpt;
5
6#[cfg(feature = "simplelog")]
7use crate::SetLogWithDefault;
8#[cfg(feature = "simplelog")]
9use simplelog::{Config, TermLogger, TerminalMode};
10#[derive(StructOpt, Debug, Clone)]
11pub struct LogLevelOpt {
12    /// Set the log level to run under
13    /// Possible values are: off, error, warn, info, debug, trace
14    #[structopt(
15        name = "loglevel",
16        long = "log-level",
17        short = "L",
18        default_value = "info",
19        global = true
20    )]
21    log_level: LevelFilter,
22}
23
24impl LogLevel for LogLevelOpt {
25    fn get_level_filter(&self) -> LevelFilter {
26        self.log_level
27    }
28}
29
30impl fmt::Display for LogLevelOpt {
31    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
32        write!(f, "{}", self.log_level)
33    }
34}
35
36#[derive(StructOpt, Debug, Clone)]
37pub struct LogLevelOptLower {
38    /// Set the log level to run under
39    /// Possible values are: off, error, warn, info, debug, trace
40    #[structopt(
41        name = "loglevellower",
42        long = "log-level",
43        short = "l",
44        default_value = "info",
45        global = true,
46        conflicts_with = "loglevel"
47    )]
48    log_level: LevelFilter,
49}
50
51impl LogLevel for LogLevelOptLower {
52    fn get_level_filter(&self) -> LevelFilter {
53        self.log_level
54    }
55}
56
57impl fmt::Display for LogLevelOptLower {
58    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
59        write!(f, "{}", self.log_level)
60    }
61}
62
63#[derive(StructOpt, Debug, Clone)]
64pub struct LogLevelNoDef {
65    /// Set the log level to run under
66    /// Possible values are: off, error, warn, info, debug, trace
67    #[structopt(name = "loglevel", long = "log-level", short = "L", global = true)]
68    log_level: Option<LevelFilter>,
69}
70
71impl GetWithDefault for LogLevelNoDef {
72    type Item = LevelFilter;
73    fn get_with_default<T: Into<Self::Item>>(&self, default: T) -> Self::Item {
74        self.log_level.unwrap_or_else(|| default.into())
75    }
76}
77
78#[cfg(feature = "simplelog")]
79impl SetLogWithDefault for LogLevelNoDef {
80    fn set_with_default(&self, default: LevelFilter) {
81        TermLogger::init(
82            self.get_with_default(default),
83            Config::default(),
84            TerminalMode::Mixed,
85        )
86        .unwrap_or(());
87    }
88}
89
90impl fmt::Display for LogLevelNoDef {
91    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
92        match self.log_level {
93            Some(x) => write!(f, "{}", x),
94            None => write!(f, "None"),
95        }
96    }
97}
98
99#[derive(StructOpt, Debug, Clone)]
100pub struct LogLevelNoDefLower {
101    /// Set the log level to run under
102    /// Possible values are: off, error, warn, info, debug, trace
103    #[structopt(name = "loglevel", long = "log-level", short = "l", global = true)]
104    log_level: Option<LevelFilter>,
105}
106
107impl GetWithDefault for LogLevelNoDefLower {
108    type Item = LevelFilter;
109    fn get_with_default<T: Into<Self::Item>>(&self, default: T) -> Self::Item {
110        self.log_level.unwrap_or_else(|| default.into())
111    }
112}
113
114#[cfg(feature = "simplelog")]
115impl SetLogWithDefault for LogLevelNoDefLower {
116    fn set_with_default(&self, default: LevelFilter) {
117        TermLogger::init(
118            self.get_with_default(default),
119            Config::default(),
120            TerminalMode::Mixed,
121        )
122        .unwrap_or(());
123    }
124}
125
126impl fmt::Display for LogLevelNoDefLower {
127    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
128        match self.log_level {
129            Some(x) => write!(f, "{}", x),
130            None => write!(f, "None"),
131        }
132    }
133}