plc-comm-slmp-rust 0.1.1

Async Rust SLMP client based on the plc-comm-slmp-dotnet implementation
Documentation
mod common;

use common::{connect_from_env, env_bool, env_csv, env_string, print_connection_banner};
use plc_comm_slmp::SlmpAddress;
use std::error::Error;

fn parse_u16_csv(key: &str, default: &str) -> Result<Vec<u16>, Box<dyn Error>> {
    env_csv(key, default)
        .into_iter()
        .map(|value| value.parse::<u16>().map_err(Into::into))
        .collect()
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    print_connection_banner("raw_read_write");
    let client = connect_from_env().await?;

    let read_address = env_string("SLMP_READ_ADDRESS", "D100");
    let read_count: u16 = env_string("SLMP_READ_COUNT", "2").parse()?;
    let words = client
        .read_words_raw(SlmpAddress::parse(&read_address)?, read_count)
        .await?;
    println!("read {read_address} count={read_count} -> {words:?}");

    if !env_bool("SLMP_ENABLE_WRITES") {
        println!("set SLMP_ENABLE_WRITES=1 to run the write/read-back part of this example");
        return Ok(());
    }

    let write_address = env_string("SLMP_WRITE_ADDRESS", "D600");
    let write_values = parse_u16_csv("SLMP_WRITE_VALUES", "111,222")?;
    client
        .write_words(SlmpAddress::parse(&write_address)?, &write_values)
        .await?;
    let read_back = client
        .read_words_raw(
            SlmpAddress::parse(&write_address)?,
            write_values.len() as u16,
        )
        .await?;
    println!("write {write_address} values={write_values:?}");
    println!("read-back {write_address} -> {read_back:?}");
    Ok(())
}