use std::path::PathBuf;
use clap::Parser;
use minotari_app_utilities::common_cli_args::CommonCliArgs;
use tari_common::configuration::{ConfigOverrideProvider, Network};
#[derive(Parser, Debug)]
#[clap(author, version, about, long_about = None)]
#[clap(propagate_version = true)]
#[allow(clippy::struct_excessive_bools)]
pub struct Cli {
#[clap(flatten)]
pub common: CommonCliArgs,
#[clap(long)]
pub init: bool,
#[clap(long, alias = "rebuild_db")]
pub rebuild_db: bool,
#[clap(short, long, alias = "non-interactive", env = "TARI_NON_INTERACTIVE")]
pub non_interactive_mode: bool,
#[clap(long)]
pub watch: Option<String>,
#[clap(long, alias = "profile")]
pub profile_with_tokio_console: bool,
#[clap(long, env = "MINOTARI_NODE_ENABLE_MINING", alias = "enable-mining")]
pub mining_enabled: bool,
#[clap(long, env = "MINOTARI_NODE_ENABLE_GRPC", alias = "enable-grpc")]
pub grpc_enabled: bool,
#[clap(long, env = "MINOTARI_NODE_GRPC_ADDRESS")]
pub grpc_address: Option<String>,
#[clap(long, env = "MINOTARI_NODE_SECOND_LAYER_GRPC_ENABLED", alias = "enable-second-layer")]
pub second_layer_grpc_enabled: bool,
#[clap(long)]
pub disable_splash_screen: bool,
#[clap(long)]
pub print_env: bool,
#[clap(short = 'z', long)]
pub libtor_data_dir: Option<PathBuf>,
}
impl ConfigOverrideProvider for Cli {
fn get_config_property_overrides(&self, network: &Network) -> Vec<(String, String)> {
let mut overrides = vec![("base_node.network".to_string(), network.to_string())];
overrides.push(("base_node.override_from".to_string(), network.to_string()));
overrides.push(("p2p.seeds.override_from".to_string(), network.to_string()));
overrides.push(("auto_update.override_from".to_string(), network.to_string()));
overrides.push(("metrics.override_from".to_string(), network.to_string()));
let command_line_overrides = self.common.get_config_property_overrides(network);
command_line_overrides.iter().for_each(|(k, v)| {
replace_or_add_override(&mut overrides, k, v);
});
if self.mining_enabled {
replace_or_add_override(&mut overrides, "base_node.mining_enabled", "true");
}
if let Some(ref addr) = self.grpc_address {
replace_or_add_override(&mut overrides, "base_node.grpc_enabled", "true");
replace_or_add_override(&mut overrides, "base_node.grpc_address", addr);
} else if self.grpc_enabled {
replace_or_add_override(&mut overrides, "base_node.grpc_enabled", "true");
} else {
}
if self.second_layer_grpc_enabled {
replace_or_add_override(&mut overrides, "base_node.grpc_enabled", "true");
replace_or_add_override(&mut overrides, "base_node.second_layer_grpc_enabled", "true");
}
overrides
}
}
fn replace_or_add_override(overrides: &mut Vec<(String, String)>, key: &str, value: &str) {
if let Some(index) = overrides.iter().position(|(k, _)| k == key) {
overrides.remove(index);
}
overrides.push((key.to_string(), value.to_string()));
}