use crate::{Client, Control, Frames, ProcessHandler, ProcessScope};
pub struct ClosureProcessHandler<T, F> {
pub state: T,
pub callbacks: F,
}
impl<ProcessCallback> ClosureProcessHandler<(), ProcessCallback>
where
ProcessCallback: 'static + Send + FnMut(&Client, &ProcessScope) -> Control,
{
pub fn new(process_callback: ProcessCallback) -> Self {
ClosureProcessHandler {
state: (),
callbacks: process_callback,
}
}
}
impl<ProcessCallback> ProcessHandler for ClosureProcessHandler<(), ProcessCallback>
where
ProcessCallback: 'static + Send + FnMut(&Client, &ProcessScope) -> Control,
{
fn process(&mut self, c: &Client, ps: &ProcessScope) -> Control {
(self.callbacks)(c, ps)
}
}
pub struct ProcessCallbacks<ProcessCallback, BufferCallback> {
process: ProcessCallback,
buffer: BufferCallback,
}
impl<T, ProcessCallback, BufferCallback>
ClosureProcessHandler<T, ProcessCallbacks<ProcessCallback, BufferCallback>>
where
T: Send,
ProcessCallback: 'static + Send + FnMut(&mut T, &Client, &ProcessScope) -> Control,
BufferCallback: 'static + Send + FnMut(&mut T, &Client, Frames) -> Control,
{
pub fn with_state(
state: T,
process_callback: ProcessCallback,
buffer_callback: BufferCallback,
) -> Self {
ClosureProcessHandler {
state,
callbacks: ProcessCallbacks {
process: process_callback,
buffer: buffer_callback,
},
}
}
}
impl<T, ProcessCallback, BufferCallback> ProcessHandler
for ClosureProcessHandler<T, ProcessCallbacks<ProcessCallback, BufferCallback>>
where
T: Send,
ProcessCallback: 'static + Send + FnMut(&mut T, &Client, &ProcessScope) -> Control,
BufferCallback: 'static + Send + FnMut(&mut T, &Client, Frames) -> Control,
{
fn process(&mut self, c: &Client, ps: &ProcessScope) -> Control {
(self.callbacks.process)(&mut self.state, c, ps)
}
fn buffer_size(&mut self, c: &Client, size: Frames) -> Control {
(self.callbacks.buffer)(&mut self.state, c, size)
}
}