wire-framed
wire-framed is a library for encoding and decoding messages using a custom binary protocol.
It prioritizes ease of use and performance.
It revolves around the [Message] type that can hold multiple frames of data (represented with the [bytes::Bytes] type),
and 4 main traits: [FromFrame], [IntoFrame], [FromMessage] and [IntoMessage].
Each frame should be a self-contained piece of data that can be decoded without any context.
Usage with frames
use wire_framed::prelude::*;
#[derive(Debug, Encoding, Decoding, PartialEq, Eq)]
pub struct Foo {
pub id: u32,
pub name: String,
pub description: String,
pub created_at: u64,
}
# fn send_to_socket(_frame: Bytes) -> Result<(), std::io::Error> { Ok(()) }
fn send() -> Result<(), std::io::Error> {
let foo = Foo {
id: 1,
name: "John".to_string(),
description: "John is a legend".to_string(),
created_at: 1234567890,
};
let frame = foo.into_frame();
send_to_socket(frame)
}
# fn recv_from_socket() -> Bytes {
# Bytes::from_static(&[
# 0x00, 0x00, 0x00, 0x01, # 0x00, 0x00, 0x00, 0x04, # 0x4a, 0x6f, 0x68, 0x6e, # 0x00, 0x00, 0x00, 0x10, # 0x4a, 0x6f, 0x68, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x65, 0x67, 0x65, 0x6e, 0x64, # 0x00, 0x00, 0x00, 0x00, 0x49, 0x96, 0x02, 0xd2, # ])
# }
fn recv() -> Result<(), std::io::Error> {
let bytes = recv_from_socket();
let foo = Foo::from_frame(bytes)?;
# Ok(())
}
# fn main() -> Result<(), std::io::Error> {
# send()?;
# recv()?;
#
# Ok(())
# }
Usage with messages
use wire_framed::prelude::*;
#[derive(Debug, Encoding, Decoding, PartialEq, Eq)]
pub struct Foo {
pub id: u32,
pub name: String,
pub description: String,
}
fn main() -> Result<(), std::io::Error> {
let foo = Foo {
id: 1,
name: "John".to_string(),
description: "John is a legend".to_string(),
};
let msg = Message::builder()
.frame(foo.into_frame())
.frame(foo.into_frame())
.build();
println!("Message: {:?}", msg);
Ok(())
}