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}