nerve-ipc 0.2.0

Binary framing protocol for local IPC over Unix Domain Sockets
Documentation
use nerve_ipc::types::{MessageType, ProtocolErrorKind};

// ── V1 message types ──────────────────────────────────────────────────────────

#[test]
fn ping_decodes() {
    assert_eq!(MessageType::try_from(0x01), Ok(MessageType::Ping));
}

#[test]
fn search_query_decodes() {
    assert_eq!(MessageType::try_from(0x02), Ok(MessageType::SearchQuery));
}

#[test]
fn search_result_decodes() {
    assert_eq!(MessageType::try_from(0x03), Ok(MessageType::SearchResult));
}

#[test]
fn ai_token_decodes() {
    assert_eq!(MessageType::try_from(0x04), Ok(MessageType::AiToken));
}

#[test]
fn cancel_decodes() {
    assert_eq!(MessageType::try_from(0x05), Ok(MessageType::Cancel));
}

// ── Agentic scaffolding types (0x10–0x12) ────────────────────────────────────

#[test]
fn agent_task_start_decodes() {
    assert_eq!(MessageType::try_from(0x10), Ok(MessageType::AgentTaskStart));
}

#[test]
fn agent_task_event_decodes() {
    assert_eq!(MessageType::try_from(0x11), Ok(MessageType::AgentTaskEvent));
}

#[test]
fn agent_task_done_decodes() {
    assert_eq!(MessageType::try_from(0x12), Ok(MessageType::AgentTaskDone));
}

// ── Unknown types must be rejected ───────────────────────────────────────────
//
// Per protocol.md: unknown message types cause connection termination
// (ProtocolErrorKind::UnknownMessageType).  TryFrom returning Err(()) is the
// codec-level signal for that outcome.

#[test]
fn unknown_type_0x00_rejected() {
    assert!(MessageType::try_from(0x00).is_err());
}

#[test]
fn unknown_type_0x06_rejected() {
    assert!(MessageType::try_from(0x06).is_err());
}

#[test]
fn unknown_type_0x0f_rejected() {
    assert!(MessageType::try_from(0x0F).is_err());
}

#[test]
fn unknown_type_0x13_rejected() {
    assert!(MessageType::try_from(0x13).is_err());
}

#[test]
fn unknown_type_0xff_rejected() {
    assert!(MessageType::try_from(0xFF).is_err());
}

// ── Codec rejects unknown message type in a wire frame ────────────────────────

#[test]
fn decode_rejects_unknown_message_type() {
    use nerve_ipc::codec::{decode, encode};
    use nerve_ipc::types::{FrameFlags, RequestId};

    let mut buf = encode(MessageType::Ping, FrameFlags::empty(), RequestId(1), &[]).unwrap();
    buf[6] = 0xFF; // corrupt msg_type to an unknown value

    let err = decode(&buf).unwrap_err();
    assert_eq!(err.kind(), ProtocolErrorKind::UnknownMessageType);
}