Skip to main content

rustmod_tools/
common.rs

1use clap::Args;
2use rustmod_client::{ClientConfig, ModbusClient};
3use rustmod_datalink::{DataLinkError, ModbusTcpTransport};
4use std::time::Duration;
5
6#[derive(Debug, Clone, Args)]
7pub struct TcpConnectionArgs {
8    #[arg(long, default_value = "127.0.0.1")]
9    pub host: String,
10    #[arg(long, default_value_t = 502)]
11    pub port: u16,
12    #[arg(long, default_value_t = 5000)]
13    pub timeout: u64,
14    #[arg(long, default_value_t = 1)]
15    pub retries: u8,
16}
17
18pub async fn build_client(
19    args: &TcpConnectionArgs,
20) -> Result<ModbusClient<ModbusTcpTransport>, DataLinkError> {
21    let addr = format!("{}:{}", args.host, args.port);
22    let transport = ModbusTcpTransport::connect(addr).await?;
23
24    let config = ClientConfig::default()
25        .with_response_timeout(Duration::from_millis(args.timeout))
26        .with_retry_count(args.retries);
27
28    Ok(ModbusClient::with_config(transport, config))
29}
30
31pub fn init_tracing() {
32    let _ = tracing_subscriber::fmt()
33        .with_env_filter(tracing_subscriber::EnvFilter::from_default_env())
34        .with_target(false)
35        .compact()
36        .try_init();
37}
38
39pub fn parse_bool(input: &str) -> Result<bool, String> {
40    match input.trim().to_ascii_lowercase().as_str() {
41        "1" | "true" | "on" | "yes" => Ok(true),
42        "0" | "false" | "off" | "no" => Ok(false),
43        _ => Err(format!("invalid bool value: {input}")),
44    }
45}