rivet-actor-runtime-socket-protocol 2.3.5

Versioned protocol for the experimental Actor Runtime Socket
//! vbare version wrappers for Actor Runtime Socket frames.
use anyhow::{Result, bail};
use vbare::OwnedVersionedData;

use crate::generated::v1;

macro_rules! versioned_v1 {
	($name:ident, $type:ty) => {
		pub enum $name {
			V1($type),
		}

		impl OwnedVersionedData for $name {
			type Latest = $type;

			fn wrap_latest(latest: Self::Latest) -> Self {
				Self::V1(latest)
			}

			fn unwrap_latest(self) -> Result<Self::Latest> {
				match self {
					Self::V1(value) => Ok(value),
				}
			}

			fn deserialize_version(payload: &[u8], version: u16) -> Result<Self> {
				match version {
					1 => Ok(Self::V1(serde_bare::from_slice(payload)?)),
					_ => bail!("unsupported Actor Runtime Socket protocol version: {version}"),
				}
			}

			fn serialize_version(self, version: u16) -> Result<Vec<u8>> {
				match (self, version) {
					(Self::V1(value), 1) => Ok(serde_bare::to_vec(&value)?),
					(_, version) => {
						bail!("unsupported Actor Runtime Socket protocol version: {version}")
					}
				}
			}

			fn deserialize_converters() -> Vec<impl Fn(Self) -> Result<Self>> {
				Vec::<fn(Self) -> Result<Self>>::new()
			}

			fn serialize_converters() -> Vec<impl Fn(Self) -> Result<Self>> {
				Vec::<fn(Self) -> Result<Self>>::new()
			}
		}
	};
}

versioned_v1!(ClientHello, v1::ClientHello);
versioned_v1!(ServerHello, v1::ServerHello);
versioned_v1!(ClientFrame, v1::ClientFrame);
versioned_v1!(ServerFrame, v1::ServerFrame);