124 lines
4 KiB
Rust
124 lines
4 KiB
Rust
//! Copyright (C) 2022, Dmitriy Pleshevskiy <dmitriy@pleshevski.ru>
|
|
//!
|
|
//! vnetod is free software: you can redistribute it and/or modify
|
|
//! it under the terms of the GNU General Public License as published by
|
|
//! the Free Software Foundation, either version 3 of the License, or
|
|
//! (at your option) any later version.
|
|
//!
|
|
//! vnetod is distributed in the hope that it will be useful,
|
|
//! but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
//! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
//! GNU General Public License for more details.
|
|
//!
|
|
//! You should have received a copy of the GNU General Public License
|
|
//! along with vnetod. If not, see <https://www.gnu.org/licenses/>.
|
|
//!
|
|
|
|
pub mod switch;
|
|
|
|
use std::path::PathBuf;
|
|
|
|
use clap::Parser;
|
|
|
|
#[derive(Parser, Debug)]
|
|
#[clap(
|
|
author,
|
|
version,
|
|
about = "\
|
|
Dotenv state switcher
|
|
---------------------------------------------------------------------
|
|
vnetod Copyright (C) 2022 Dmitriy Pleshevskiy <dmitriy@pleshevski.ru>
|
|
This program comes with ABSOLUTELY NO WARRANTY;
|
|
This is free software, and you are welcome to redistribute it
|
|
under certain conditions;
|
|
---------------------------------------------------------------------
|
|
"
|
|
)]
|
|
pub struct Args {
|
|
#[clap(
|
|
short = 'f',
|
|
long,
|
|
default_value = ".env",
|
|
env = "VNETOD_FILE",
|
|
help = "Change source file with environment variables"
|
|
)]
|
|
pub file: PathBuf,
|
|
|
|
#[clap(
|
|
short = 'o',
|
|
long,
|
|
help = "Change output file with modified environment variables. It uses `file` argument by default if the output is not specified"
|
|
)]
|
|
pub output: Option<PathBuf>,
|
|
|
|
#[clap(
|
|
long,
|
|
help = "Writes modified environment variables to stdout instead of a file. `Output` argument will be ignored."
|
|
)]
|
|
pub dry_run: bool,
|
|
|
|
#[clap(
|
|
value_parser,
|
|
help = "Environment varible sections that will be enabled"
|
|
)]
|
|
pub sections: Vec<String>,
|
|
|
|
#[cfg(feature = "color")]
|
|
#[clap(
|
|
long,
|
|
value_enum,
|
|
default_value = "auto",
|
|
long_help = "
|
|
This flag controls when to use colors. The default setting is 'auto', which
|
|
means vnetod will try to guess when to use colors. For example, if vnetod is
|
|
printing to a terminal, then it will use colors, but if it is redirected to a
|
|
file or a pipe, then it will suppress color output. vnetod will suppress color
|
|
output in some other circumstances as well. For example, if the TERM
|
|
environment variable is not set or set to 'dumb', then vnetod will not use
|
|
colors.
|
|
|
|
The possible values for this flag are:
|
|
|
|
never Colors will never be used.
|
|
auto The default. vnetod tries to be smart.
|
|
always Colors will always be used regardless of where output is sent.
|
|
ansi Like 'always', but emits ANSI escapes (even in a Windows console).
|
|
|
|
"
|
|
)]
|
|
pub color: ColorVariant,
|
|
}
|
|
|
|
#[cfg(feature = "color")]
|
|
#[derive(clap::ValueEnum, Clone, Debug)]
|
|
pub enum ColorVariant {
|
|
Auto,
|
|
Always,
|
|
Ansi,
|
|
Never,
|
|
}
|
|
|
|
#[cfg(feature = "color")]
|
|
impl From<ColorVariant> for termcolor::ColorChoice {
|
|
fn from(col: ColorVariant) -> Self {
|
|
match col {
|
|
ColorVariant::Never => Self::Never,
|
|
ColorVariant::Always => Self::Always,
|
|
ColorVariant::Ansi => Self::AlwaysAnsi,
|
|
ColorVariant::Auto => {
|
|
if atty::is(atty::Stream::Stdout) {
|
|
// Otherwise let's `termcolor` decide by inspecting the environment. From the [doc]:
|
|
// - If `NO_COLOR` is set to any value, then colors will be suppressed.
|
|
// - If `TERM` is set to dumb, then colors will be suppressed.
|
|
// - In non-Windows environments, if `TERM` is not set, then colors will be suppressed.
|
|
//
|
|
// [doc]: https://github.com/BurntSushi/termcolor#automatic-color-selection
|
|
Self::Auto
|
|
} else {
|
|
// Colors should be deactivated if the terminal is not a tty.
|
|
Self::Never
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|