Serdes fixes and general improvements
This commit is contained in:
parent
8cb4425c83
commit
eb7274c599
5 changed files with 62 additions and 3 deletions
|
@ -5,3 +5,4 @@ edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
polariton = { version = "0.1.0", path = "../" }
|
polariton = { version = "0.1.0", path = "../" }
|
||||||
|
log = "0.4"
|
||||||
|
|
|
@ -46,7 +46,7 @@ impl <U: Send + Sync> OperationsHandler<U> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn with_state<S: Send + Sync + 'static, O: Operation<State=S, User=U> + OperationCode + 'static>(mut self, op: O, state: S) -> Self {
|
pub fn with_state<S: Send + Sync + 'static, O: Operation<State=S, User=U> + OperationCode + 'static>(mut self, op: O, state: S) -> Self {
|
||||||
self.op_map.insert(O::op_code(), Box::new(SyncedOpWrapper {
|
self.insert_op(O::op_code(), Box::new(SyncedOpWrapper {
|
||||||
state: Mutex::new(state),
|
state: Mutex::new(state),
|
||||||
handler: op,
|
handler: op,
|
||||||
}));
|
}));
|
||||||
|
@ -54,12 +54,18 @@ impl <U: Send + Sync> OperationsHandler<U> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn without_state<O: Operation<State=(), User=U> + OperationCode + 'static>(mut self, op: O) -> Self {
|
pub fn without_state<O: Operation<State=(), User=U> + OperationCode + 'static>(mut self, op: O) -> Self {
|
||||||
self.op_map.insert(O::op_code(), Box::new(StatelessOpWrapper {
|
self.insert_op(O::op_code(), Box::new(StatelessOpWrapper {
|
||||||
handler: op,
|
handler: op,
|
||||||
}));
|
}));
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn insert_op(&mut self, code: u8, handler: Box<dyn WrappedOperation<U>>) {
|
||||||
|
if self.op_map.insert(code, handler).is_some() {
|
||||||
|
log::warn!("Replacing operation for code {}", code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn try_pass_to_handler(&self, code: u8, params: ParameterTable, user:&U) -> OperationResponse {
|
fn try_pass_to_handler(&self, code: u8, params: ParameterTable, user:&U) -> OperationResponse {
|
||||||
if let Some(handler) = self.op_map.get(&code) {
|
if let Some(handler) = self.op_map.get(&code) {
|
||||||
handler.handle(params, user)
|
handler.handle(params, user)
|
||||||
|
|
|
@ -24,3 +24,6 @@ pub use type_prefixed::Typed;
|
||||||
|
|
||||||
mod typed_dict;
|
mod typed_dict;
|
||||||
pub use typed_dict::Dict;
|
pub use typed_dict::Dict;
|
||||||
|
|
||||||
|
mod typed_arr;
|
||||||
|
pub use typed_arr::Arr;
|
||||||
|
|
|
@ -41,7 +41,7 @@ pub enum Typed {
|
||||||
#[brw(magic = 120u8)]
|
#[brw(magic = 120u8)]
|
||||||
Bytes(super::SizePrefixedVec<i32, u8>),
|
Bytes(super::SizePrefixedVec<i32, u8>),
|
||||||
#[brw(magic = 121u8)]
|
#[brw(magic = 121u8)]
|
||||||
Arr(super::SizePrefixedVec<i16, Typed>),
|
Arr(super::Arr),
|
||||||
#[brw(magic = 122u8)]
|
#[brw(magic = 122u8)]
|
||||||
ObjArr(super::SizePrefixedVec<i16, Typed>),
|
ObjArr(super::SizePrefixedVec<i16, Typed>),
|
||||||
}
|
}
|
||||||
|
|
49
src/operation/typed_arr.rs
Normal file
49
src/operation/typed_arr.rs
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
use binrw::{BinRead, BinWrite};
|
||||||
|
|
||||||
|
use super::Typed;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct Arr {
|
||||||
|
pub ty: u8,
|
||||||
|
pub items: Vec<Typed>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BinRead for Arr {
|
||||||
|
type Args<'a> = ();
|
||||||
|
|
||||||
|
fn read_options<R: std::io::Read + std::io::Seek>(
|
||||||
|
reader: &mut R,
|
||||||
|
endian: binrw::Endian,
|
||||||
|
args: Self::Args<'_>,
|
||||||
|
) -> binrw::BinResult<Self> {
|
||||||
|
let len = i16::read_options(reader, endian, args)?;
|
||||||
|
let ty = u8::read_options(reader, endian, args)?;
|
||||||
|
let mut items = Vec::with_capacity(len as _);
|
||||||
|
for _ in 0..len {
|
||||||
|
let item = Typed::with_magic(ty, reader)?;
|
||||||
|
|
||||||
|
items.push(item);
|
||||||
|
}
|
||||||
|
Ok(Self {
|
||||||
|
ty, items,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BinWrite for Arr {
|
||||||
|
type Args<'a> = ();
|
||||||
|
|
||||||
|
fn write_options<W: std::io::Write + std::io::Seek>(
|
||||||
|
&self,
|
||||||
|
writer: &mut W,
|
||||||
|
endian: binrw::Endian,
|
||||||
|
args: Self::Args<'_>,
|
||||||
|
) -> binrw::BinResult<()> {
|
||||||
|
(self.items.len() as i16).write_options(writer, endian, args)?;
|
||||||
|
self.ty.write_options(writer, endian, args)?;
|
||||||
|
for item in &self.items {
|
||||||
|
item.write_inner(writer)?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue