use clap::Parser;
use clap::builder::Styles;
use clap::builder::styling::RgbColor;
use color_eyre::Result;
use convd::server::start_server;
use convertor::common::config::ConvertorConfig;
use convertor::common::once::{init_backtrace, init_base_dir, init_log};
use convertor::common::redis::{init_redis, redis_client, redis_url};
use convertor::provider_api::ProviderApi;
use std::net::SocketAddrV4;
use std::path::PathBuf;
pub const SONOKAI_TC: Styles = Styles::styled()
.header(RgbColor(0xE7, 0xC6, 0x64).on_default().bold().underline())
.usage(RgbColor(0x9E, 0xD0, 0x72).on_default().bold())
.literal(RgbColor(0xF3, 0x96, 0x60).on_default().bold())
.placeholder(RgbColor(0x76, 0xCC, 0xE0).on_default().italic().dimmed())
.error(RgbColor(0xFC, 0x5D, 0x7C).on_default().bold())
.valid(RgbColor(0x9E, 0xD0, 0x72).on_default().bold())
.invalid(RgbColor(0xFC, 0x5D, 0x7C).on_default());
#[derive(Debug, Parser)]
#[clap(version, author, styles = SONOKAI_TC)]
pub struct Convertor {
#[arg(default_value = "127.0.0.1:8080")]
listen: SocketAddrV4,
#[arg(short)]
config: Option<PathBuf>,
}
#[tokio::main(flavor = "multi_thread")]
async fn main() -> Result<()> {
let base_dir = init_base_dir();
init_backtrace();
init_log(Some(&base_dir));
init_redis()?;
let args = Convertor::parse();
let redis_client = redis_client(redis_url())?;
let connection = redis_client.get_multiplexed_async_connection().await?;
let connection_manager = redis::aio::ConnectionManager::new_with_config(
redis_client.clone(),
redis::aio::ConnectionManagerConfig::new()
.set_number_of_retries(5)
.set_max_delay(2000),
)
.await?;
let config = ConvertorConfig::search_or_redis(&base_dir, args.config, connection).await?;
let api_map = ProviderApi::create_api(config.providers.clone(), connection_manager);
start_server(args.listen, config, api_map, &base_dir, redis_client).await?;
Ok(())
}