pajamax 0.2.0

Fast gRPC server framework in synchronous mode.
Documentation
use std::net::TcpStream;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;

use crate::config::Config;
use crate::connection::ConnectionMode;
use crate::response_end::ResponseEnd;
use crate::PajamaxService;

pub struct LocalConnection<S: PajamaxService> {
    srv: S,
    resp_end: ResponseEnd,
    counter: Arc<AtomicUsize>,
}

impl<S: PajamaxService> LocalConnection<S> {
    pub fn new(srv: S, c: &TcpStream, counter: Arc<AtomicUsize>, config: &Config) -> Self {
        counter.fetch_add(1, Ordering::Relaxed);
        Self {
            srv,
            resp_end: ResponseEnd::new(c, config),
            counter,
        }
    }
}

impl<S: PajamaxService> Drop for LocalConnection<S> {
    fn drop(&mut self) {
        self.counter.fetch_sub(1, Ordering::Relaxed);
    }
}

impl<S: PajamaxService> ConnectionMode for LocalConnection<S> {
    type Service = S;

    fn handle_call(
        &mut self,
        request: S::Request,
        stream_id: u32,
        req_data_len: usize,
    ) -> Result<(), std::io::Error> {
        let response = self.srv.call(request);

        self.resp_end.build(stream_id, response, req_data_len);

        self.resp_end.flush(false)
    }

    fn defer_flush(&mut self) -> Result<(), std::io::Error> {
        self.resp_end.flush(true)
    }
}