use ::std::error::Error;
fn default_com_port() -> String {
#[cfg(target_family="unix")]
{"/dev/ttyUSB0".to_string()}
#[cfg(target_family="windows")]
{"COM6".to_string()}
}
fn default_device_name() -> String {
"USB-SERIAL CH340".to_string()
}
fn default_auto_select() -> bool {
true
}
fn default_baud_rate() -> u32 {
115_200
}
#[derive(::serde::Serialize, ::serde::Deserialize)]
pub(crate) struct Args {
#[serde(default = "default_auto_select")]
pub auto_select: bool,
#[serde(default = "default_device_name")]
pub device_name: String,
#[serde(default = "default_com_port")]
pub com_port: String,
#[serde(default = "default_baud_rate")]
pub baud_rate: u32,
#[serde(default)]
pub timeout_ms: u64,
}
impl Default for Args {
fn default() -> Self {
Self {
auto_select: true,
device_name: "USB-SERIAL CH340".to_string(),
com_port: "COM6".to_string(),
baud_rate: 115200,
timeout_ms: Default::default()
}
}
}
pub(super) fn parse_args(args: *const std::ffi::c_char) -> Result<Args, Box<dyn Error>> {
let args_str = unsafe{std::ffi::CString::from_raw(args as *mut _)};
if args_str.is_empty() {
Ok(Args::default())
} else {
log::info!("inputflow_kmbox received args: {args_str:?}");
Ok(ron::from_str(args_str.to_str()?)?)
}
}