diff --git a/Cargo.toml b/Cargo.toml index e8a832d..fe234a1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,6 @@ edition = "2021" [features] custom_pieces = [] -logging = ["dep:tracing", "dep:tracing-subscriber"] [dependencies] toml = { version = "0.8.12" } @@ -13,5 +12,6 @@ clap = { version = "4.5.4", features = ["derive"] } serde = { version = "1.0.197", features = ["derive"] } serde_derive = { version = "1.0.197" } num_cpus = "1.16.0" -tracing = { version = "0.1.40", optional = true } -tracing-subscriber = { version = "0.3.18", optional = true } +tracing = { version = "0.1.40" } +tracing-appender = { version = "0.2.3" } +tracing-subscriber = { version = "0.3.18", features = ["fmt"] } diff --git a/saltdish b/saltdish new file mode 100644 index 0000000..e69de29 diff --git a/saltfish.log b/saltfish.log new file mode 100644 index 0000000..e69de29 diff --git a/src/config/args.rs b/src/config/args.rs index b6bf36f..b3d818b 100644 --- a/src/config/args.rs +++ b/src/config/args.rs @@ -1,7 +1,8 @@ use std::path::PathBuf; -#[derive(clap::Parser)] +// TODO: figure out why -h/--help don't work +#[derive(clap::Parser, Debug)] pub struct Args { #[arg(short, long="config", default_value = "config.toml")] config_path: Option, @@ -14,6 +15,13 @@ pub struct Args { #[arg(short, long)] jobs: Option, + + #[arg(long, value_parser = + clap::builder::PossibleValuesParser::new(["trace", "debug", "info", "warn", "error"]) + )] + log_level: Option, + #[arg(long)] + log_file: Option, } impl Default for Args { @@ -23,6 +31,9 @@ impl Default for Args { depth: None, strenght: None, jobs: None, + + log_level: None, + log_file: None, } } } @@ -44,4 +55,12 @@ impl Args { pub fn get_jobs(&self) -> Option { self.jobs } + + pub fn get_log_level(&self) -> Option { + self.log_level.clone() + } + + pub fn get_log_file(&self) -> Option { + self.log_file.clone() + } } diff --git a/src/config/config.rs b/src/config/config.rs index 1dbebe9..3163e26 100644 --- a/src/config/config.rs +++ b/src/config/config.rs @@ -1,4 +1,4 @@ -use std::{fs::File, io::Read, path::Path, u8}; +use std::{fs::File, io::Read, path::{Path, PathBuf}, u8}; use serde::Deserialize; use crate::config::{args::Args, engine::Engine}; @@ -17,7 +17,10 @@ pub struct Config { #[serde(rename = "piece")] pieces: Option>, - engine: Option + engine: Option, + + log_level: Option, + log_file: Option } impl Default for Config { @@ -28,6 +31,8 @@ impl Default for Config { engine: Some(Engine::default()), + log_level: Some("INFO".to_string()), + log_file: Some(PathBuf::from("saltfish.log")), } } } @@ -50,6 +55,28 @@ impl Config { args.get_depth().or(self.engine.clone().unwrap_or_default().depth()), args.get_jobs().or(self.engine.clone().unwrap_or_default().jobs()), )), + + log_level: args.get_log_level().or(self.log_level), + log_file: args.get_log_file().or(self.log_file) + } } } + +impl Config { + pub fn get_pieces(&self) -> &Option> { + &self.pieces + } + + pub fn get_engine(&self) -> &Option { + &self.engine + } + + pub fn get_log_level(&self) -> &Option { + &self.log_level + } + + pub fn get_log_file(&self) -> &Option { + &self.log_file + } +} diff --git a/src/config/mod.rs b/src/config/mod.rs index 4144926..8f60e90 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -1,18 +1,22 @@ mod config; mod args; mod engine; + pub mod error; -use self::{args::Args, config::Config, error::ConfigError}; +use self::{args::Args, config::Config}; use clap::Parser; +use tracing::{error, info}; -pub fn get_config() -> Result { + +pub fn get_config() -> Config { // TODO: implement error handling and logging and handle this case appropriate let args = Args::try_parse().unwrap_or_else(|err|{ - println!("error parsing cmd args\n{:#?}", err); + // error!(err.kind()); + error!("{}", format!("{}", err.kind().as_str().unwrap_or("parsing arguments"))); + info!("continuing withouth commandline arguments"); Args::default() }); let config_path = args.get_config_path().unwrap_or_default(); - let config = Config::read(&config_path).merge_args(&args); - Ok(config) + Config::read(&config_path).merge_args(&args) } diff --git a/src/logging.rs b/src/logging.rs new file mode 100644 index 0000000..05581a2 --- /dev/null +++ b/src/logging.rs @@ -0,0 +1,18 @@ +use std::path::Path; + +use tracing::Level; +use tracing_subscriber::fmt; + +pub fn logger_init() { + fmt() + .with_max_level(Level::DEBUG) + .init(); +} + +pub fn logger_update(file: &Path, level: Level) { + let file_appender = tracing_appender::rolling::never(file.parent().unwrap(), file.file_name().unwrap()); + let _ = tracing_appender::non_blocking(file_appender); + fmt() + .with_max_level(level) + .finish(); +} diff --git a/src/main.rs b/src/main.rs index 02b61cc..ab637b5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,10 @@ clippy::module_inception )] + +use tracing::{info, error, Level}; +use std::str::FromStr; + use crate::config::get_config; mod chess; @@ -10,6 +14,18 @@ mod config; mod errors; +mod logging; +use crate::logging::*; + + + fn main() { - let _config = get_config(); + logger_init(); + let config = get_config(); + logger_update( + config.get_log_file().as_ref().unwrap(), + Level::from_str(config.get_log_level().as_ref().unwrap().as_str()).unwrap() + ); + error!("test"); + println!("{config:#?}"); }