4个版本
0.1.4 | 2024年1月10日 |
---|---|
0.1.3 | 2024年1月10日 |
0.1.2 | 2024年1月9日 |
0.1.1 | 2024年1月9日 |
#314 in 配置
31每月下载
18KB
300 代码行
config-items
config-items是一个包含常用配置项和实用函数的库。
安装
# Cargo.toml
[dependencies]
config-items = "0.1"
用法
定义自己的"Config"结构体,并添加来自此库的预定义项。
所有示例均在此处:这里。
以下示例的配置样本在此处:这里。
use config_items::*;
use log::*;
use std::error::Error;
use serde::Deserialize;
use clap::{Arg, Command, ArgMatches};
fn make_args<'a>() -> Command<'a> {
Command::new("tupacrs")
.author("My Self <[email protected]>")
.about("Abput my app")
.arg(Arg::new("config")
.short('c')
.long("config-file")
.takes_value(true)
.help(
"Select config filename.
You can also define the pair of environment variables:
MYAPP_CONF_DIR (defaults to '.')
MYAPP_CONF_FILE (defaults to 'tupacrs.yaml')
or (all in one)
MYAPP_CONF_PATH (full path to config file)"))
}
#[derive(Deserialize, Debug)]
struct Config {
name: String,
network: Option<Network>, // from config_items
#[serde(default)] // use defaults if not present
logging: Logging, // from config_items
}
struct MyArgResolver<'a> {
matches:&'a ArgMatches
}
impl<'a> CFGResolver for MyArgResolver<'a> {
fn get_from_argument(&self) -> Option<&str> {
self.matches.value_of("config")
}
}
fn main() -> Result<(), Box<dyn Error>> {
// This is the recommended setup!!!
set_app_id("MYAPP"); // Without this call an attempt to deduce the id from the current executable name will be made
let (app_id, app_yaml, app_log) = get_app_vars();
println!("app vars: id=[{app_id}], yaml=[{app_yaml}], log=[{app_log}]");
let (v_pp, v_c_path, v_c_dir, v_c_file) = get_env_vars();
println!("env vars: proxy_password=[{v_pp}], config: path=[{v_c_path}], path=[{v_c_dir}], path=[{v_c_file}]");
let matches = make_args().get_matches();
let cfg_file = get_config_file_name(&MyArgResolver{matches:&matches});
let cfg:Config = read_config_from_yaml(&cfg_file)?;
println!("Using config [{}]", cfg.name);
if let Some(net) = cfg.network {
println!(" Got network settings: validate ssl:{}", net.skip_ssl_validation());
if let Some(proxy) = net.proxy {
// println!(" Got proxy settings: {proxy:?}");
if let Some(user) = proxy.get_user() {
println!(" Proxy user will be [{user}]")
}
if let Some(pass) = proxy.get_password() {
println!(" Proxy password will be [{pass}]")
}
println!("Final proxy url will be [{}]", proxy.get_url())
}
}
println!("Logging with: {:?}", cfg.logging);
cfg.logging.init()?;
info!("This will be logged");
Ok(())
}
许可协议
在MIT许可协议下发布 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
依赖项
~4MB
~79K SLoC