motorcortex-rust 0.5.0

Motorcortex Rust: a Rust client for the Motorcortex Core real-time control system (async + blocking).
Documentation
//! Group management RPCs on the new `core::Request`.

use motorcortex_rust::core::Request;
use motorcortex_rust::{ConnectionOptions, StatusCode};

use crate::{CERT_PATH, URL_REQ};

#[tokio::test]
async fn test_async_create_and_remove_group() {
    let req = Request::new();
    let opts = ConnectionOptions::new(CERT_PATH.to_string(), 5000, 5000);
    req.connect(URL_REQ, opts).await.expect("connect");

    let group = req
        .create_group(
            ["root/Control/dummyBoolVec", "root/Control/dummyBool"],
            "async-test",
            1000,
        )
        .await
        .expect("create_group");

    assert_eq!(group.status, StatusCode::Ok as i32);
    assert!(group.id != 0, "server should assign a non-zero group id");
    assert_eq!(group.alias, "async-test");

    let status = req.remove_group("async-test").await.expect("remove_group");
    assert_eq!(status, StatusCode::Ok);

    req.disconnect().await.expect("disconnect");
}

#[tokio::test]
async fn test_async_remove_nonexistent_group_surfaces_status_code() {
    // Removing a group the server doesn't know about returns a
    // non-OK StatusCode — but it's not a transport error, so the
    // RPC itself returns Ok(code) and the caller branches on the
    // value. Matches the crate-wide rule that
    // `Result<StatusCode>` never converts non-OK into Err.
    let req = Request::new();
    let opts = ConnectionOptions::new(CERT_PATH.to_string(), 5000, 5000);
    req.connect(URL_REQ, opts).await.expect("connect");

    let status = req
        .remove_group("definitely-not-a-real-async-group")
        .await
        .expect("RPC itself must succeed; server reports via status");
    assert_ne!(
        status,
        StatusCode::Ok,
        "server should not report Ok for a group it never created",
    );

    req.disconnect().await.expect("disconnect");
}