pi-workflows 0.16.0

Terminal client and live relay for hosted pi-workflows state
Documentation
use piw::protocol::{parse_client_request, parse_server_message};
use serde::Deserialize;
use serde_json::Value;
use std::path::PathBuf;

#[derive(Deserialize)]
struct ProtocolFixture {
    valid: Vec<String>,
    invalid: Vec<String>,
}

#[test]
fn rust_accepts_and_rejects_the_shared_client_protocol_fixtures() {
    let path = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
        .parent()
        .expect("repository root")
        .join("protocol/fixtures/client-v1.json");
    let fixture: ProtocolFixture =
        serde_json::from_slice(&std::fs::read(path).expect("protocol fixture"))
            .expect("valid protocol fixture");

    for line in fixture.valid {
        let value: Value = serde_json::from_str(&line).expect("fixture JSON");
        let result = if value.get("type").and_then(Value::as_str) == Some("request") {
            parse_client_request(&line).map(|_| ())
        } else {
            parse_server_message(&line).map(|_| ())
        };
        assert!(result.is_ok(), "valid fixture was rejected: {line}");
    }

    for line in fixture.invalid {
        let value: Value = serde_json::from_str(&line).expect("fixture JSON");
        let result = if value.get("type").and_then(Value::as_str) == Some("request") {
            parse_client_request(&line).map(|_| ())
        } else {
            parse_server_message(&line).map(|_| ())
        };
        assert!(result.is_err(), "invalid fixture was accepted: {line}");
    }
}