use epics_base_rs::server::iocsh::registry::ArgValue;
pub struct AttrPlotArgs {
pub port_name: String,
pub n_attributes: usize,
pub cache_size: usize,
pub n_data_blocks: usize,
pub in_port: String,
pub queue_size: usize,
}
pub fn parse_attr_plot_args(args: &[ArgValue]) -> Result<AttrPlotArgs, String> {
let port_name = match args.first() {
Some(ArgValue::String(s)) if !s.is_empty() => s.clone(),
_ => return Err("NDAttrPlotConfig: portName required".into()),
};
let usize_arg = |i: usize, default: usize| match args.get(i) {
Some(ArgValue::Int(n)) => (*n).max(0) as usize,
_ => default,
};
let in_port = match args.get(4) {
Some(ArgValue::String(s)) => s.clone(),
_ => String::new(),
};
Ok(AttrPlotArgs {
port_name,
n_attributes: usize_arg(1, 8),
cache_size: usize_arg(2, 1000),
n_data_blocks: usize_arg(3, 4),
in_port,
queue_size: usize_arg(6, 20),
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parse_attr_plot_args_maps_c_positional_order() {
let args = vec![
ArgValue::String("AP1".to_string()),
ArgValue::Int(10), ArgValue::Int(500), ArgValue::Int(3), ArgValue::String("DET1".to_string()), ArgValue::Int(0), ArgValue::Int(50), ArgValue::Int(0), ];
let p = parse_attr_plot_args(&args).unwrap();
assert_eq!(p.port_name, "AP1");
assert_eq!(p.n_attributes, 10);
assert_eq!(p.cache_size, 500);
assert_eq!(p.n_data_blocks, 3);
assert_eq!(p.in_port, "DET1");
assert_eq!(p.queue_size, 50);
}
#[test]
fn parse_attr_plot_args_requires_port_name() {
assert!(parse_attr_plot_args(&[]).is_err());
assert!(parse_attr_plot_args(&[ArgValue::String(String::new())]).is_err());
assert!(parse_attr_plot_args(&[ArgValue::Int(1)]).is_err());
}
#[test]
fn parse_attr_plot_args_honours_explicit_zero_and_defaults_absent() {
let args = vec![
ArgValue::String("AP2".to_string()),
ArgValue::Missing, ArgValue::Int(0), ];
let p = parse_attr_plot_args(&args).unwrap();
assert_eq!(p.n_attributes, 8, "absent n_attributes -> fallback");
assert_eq!(
p.cache_size, 0,
"explicit 0 cache_size honoured (unlimited)"
);
assert_eq!(p.n_data_blocks, 4, "absent n_data_blocks -> fallback");
assert_eq!(p.in_port, "", "absent in_port -> empty");
assert_eq!(p.queue_size, 20, "absent queue_size -> fallback");
}
}