Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name = "historyprovider"
description = "historyprovider-rs"
license = "MIT"
repository = "https://github.com/silicon-heaven/historyprovider-rs"
version = "2.4.1"
version = "2.5.0"
edition = "2024"

[[bin]]
Expand Down
60 changes: 41 additions & 19 deletions src/bin/hp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,6 @@ struct Opts {
/// Config file path
#[arg(long)]
config: Option<String>,
/// Historyprovider config file
#[arg(long, default_value = "config.yaml")]
hp_config: String,
/// Create default config file if one specified by --config is not found
#[arg(short, long)]
create_default_config: bool,
Expand All @@ -39,6 +36,24 @@ struct Opts {
/// Print version and exit
#[arg(short = 'V', long)]
version: bool,

// HP specific options
//
/// Path to journal directory
#[arg(long)]
journal_dir: Option<String>,
/// Maximum number of parallel sync tasks
#[arg(long)]
max_sync_tasks: Option<usize>,
/// Maximum size of journal directory in bytes
#[arg(long)]
max_journal_dir_size: Option<usize>,
/// Periodic sync interval in seconds
#[arg(long)]
periodic_sync_interval: Option<u64>,
/// Number of days to keep history data
#[arg(long)]
days_to_keep: Option<i64>,
}

fn init_logger(cli_opts: &Opts) {
Expand All @@ -65,24 +80,34 @@ fn print_banner(text: impl AsRef<str>) {
info!("{banner_line}");
}

fn load_client_config(cli_opts: Opts) -> shvrpc::Result<ClientConfig> {
let mut config = if let Some(config_file) = &cli_opts.config {
ClientConfig::from_file_or_default(config_file, cli_opts.create_default_config)?
fn load_client_config(cli_opts: Opts) -> shvrpc::Result<(ClientConfig, HpConfig)> {
let (mut client_config, mut hp_config) = if let Some(config_file) = &cli_opts.config {
(
ClientConfig::from_file_or_default(config_file, cli_opts.create_default_config)?,
HpConfig::load(config_file)?,
)
} else {
Default::default()
(Default::default(), Default::default())
};
config.url = cli_opts.url.map_or_else(|| Ok(config.url), |url_str| Url::parse(&url_str))?;
config.device_id = cli_opts.device_id.or(config.device_id);
config.mount = cli_opts.mount.or(config.mount);
config.reconnect_interval = cli_opts.reconnect_interval.map_or_else(
|| Ok(config.reconnect_interval),
client_config.url = cli_opts.url.map_or_else(|| Ok(client_config.url), |url_str| Url::parse(&url_str))?;
client_config.device_id = cli_opts.device_id.or(client_config.device_id);
client_config.mount = cli_opts.mount.or(client_config.mount);
client_config.reconnect_interval = cli_opts.reconnect_interval.map_or_else(
|| Ok(client_config.reconnect_interval),
|interval_str| duration_str::parse(&interval_str).map(Some)
)?;
config.heartbeat_interval = cli_opts.heartbeat_interval.map_or_else(
|| Ok(config.heartbeat_interval),
client_config.heartbeat_interval = cli_opts.heartbeat_interval.map_or_else(
|| Ok(client_config.heartbeat_interval),
|interval_str| duration_str::parse(&interval_str)
)?;
Ok(config)

hp_config.journal_dir = cli_opts.journal_dir.unwrap_or(hp_config.journal_dir);
hp_config.max_sync_tasks = cli_opts.max_sync_tasks.or(hp_config.max_sync_tasks);
hp_config.max_journal_dir_size = cli_opts.max_journal_dir_size.or(hp_config.max_journal_dir_size);
hp_config.periodic_sync_interval = cli_opts.periodic_sync_interval.or(hp_config.periodic_sync_interval);
hp_config.days_to_keep = cli_opts.days_to_keep.or(hp_config.days_to_keep);

Ok((client_config, hp_config))
}

#[tokio::main]
Expand All @@ -97,10 +122,7 @@ pub(crate) async fn main() -> shvrpc::Result<()> {

init_logger(&cli_opts);
print_banner(format!("{} {} starting", std::module_path!(), PKG_VERSION));

let hp_config = cli_opts.hp_config.clone();
let client_config = load_client_config(cli_opts).expect("Invalid config");
let hp_config = HpConfig::load(hp_config)?;
let (client_config, hp_config) = load_client_config(cli_opts).expect("Invalid config");

historyprovider::run(&hp_config, &client_config).await
}
22 changes: 17 additions & 5 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,23 @@ fn default_journal_dir() -> String {
#[derive(Clone, Deserialize)]
pub struct HpConfig {
#[serde(default = "default_journal_dir")]
journal_dir: String,
max_sync_tasks: Option<usize>,
max_journal_dir_size: Option<usize>,
periodic_sync_interval: Option<u64>,
days_to_keep: Option<i64>,
pub journal_dir: String,
pub max_sync_tasks: Option<usize>,
pub max_journal_dir_size: Option<usize>,
pub periodic_sync_interval: Option<u64>,
pub days_to_keep: Option<i64>,
}

impl Default for HpConfig {
fn default() -> Self {
Self {
journal_dir: default_journal_dir(),
max_sync_tasks: None,
Comment thread
j4r0u53k marked this conversation as resolved.
Outdated
max_journal_dir_size: None,
periodic_sync_interval: None,
days_to_keep: None,
}
}
}

impl HpConfig {
Expand Down