jupyter-protocol 0.4.0

Jupyter messaging structures and traits for jupyter clients and servers
Documentation
# `jupyter-protocol`

This crate provides types for `JupyterMessage`s, for use with either the native `zeromq` backend (currently in `runtimelib`) or the `websocket` backend (in `jupyter-websocket-client`).

## Usage

```rust
use jupyter_protocol::{JupyterMessage, ExecuteRequest, ExecuteReply, JupyterMessageContent};

fn main() {
    let message: JupyterMessage = ExecuteRequest {
        code: "print('Hello, world!')".to_string(),
        silent: false,
        store_history: true,
        user_expressions: Default::default(),
        allow_stdin: false,
    }.into();

    socket.send(message).await?;

    while let Some(reply) = socket.recv().await? {
        match reply.content {
            JupyterMessageContent::ExecuteReply(reply) => {
                println!("Execution completed with status: {:?}", reply.status);
            }
            JupyterMessageContent::StreamContent(content) => {
                assert_eq!(content.name, "stdout");
                assert_eq!(content.text, "Hello, world!\n");
                println!("Received stdout message: {:?}", content.text);
            }
            other => {
                println!("Received other message: {:?}", other);
            }
        }
    }
}
```