water_http 4.0.1

fast web http framework that support http 1 and http 2 with very easy use
Documentation
use std::fmt::{Display};
// use bytes::{BytesMut};
use  water_buffer::WaterBuffer as BM; type BytesMut = BM<u8>;
use crate::http::status_code::HttpStatusCode as StatusCode;



/// for writing http response format bytes to given buffer
pub struct HttpResponseBufferWriter<'a> {
    /// writable given buffer
    write_able_buffer:&'a mut BytesMut
}




 impl<'a> HttpResponseBufferWriter<'a> {
     /// for creating ok response with 200 status code
     #[inline]
     pub  fn success(buffer:&'a mut BytesMut)->HttpResponseBufferWriter<'a>{
         Self::with_version_and_status(buffer,StatusCode::OK)
     }

     /// for initiating new [HttpResponseBufferWriter] struct
     pub fn new(buffer:&'a mut BytesMut)->HttpResponseBufferWriter<'a>{
         HttpResponseBufferWriter{
             write_able_buffer:buffer
         }
     }

     /// for creating ok response with 200 status code
     #[inline]
     pub fn with_version_and_status(buffer:&'a mut BytesMut,status:StatusCode)->HttpResponseBufferWriter<'a>{
         buffer.extend_from_slice(format!("HTTP/1.1 {} {}\r\n",
          status.status,
          status.label
         ).as_bytes());
         HttpResponseBufferWriter {
             write_able_buffer:buffer
         }
     }
     
     /// for setting header key and value pair to response
     #[inline]
     pub fn set_header_pair(&mut self,key:impl Display,value:impl Display){
         self.write_able_buffer.extend_from_slice(
             format!("{key}: {value}\r\n")
                 .as_bytes()
         );
     }
     
     /// setting data to the response
     #[inline]
     pub fn send_data_with_content_length(&mut self,data:ResponseData<'a>){
         let data = data.as_bytes();
         self.write_able_buffer.extend_from_slice(format!("Content-Length: {}\r\n\r\n",data.len()).as_bytes());
         self.write_able_buffer.extend_from_slice(data);
     }

     /// setting custom data to the response buffer without counting content-length
     /// so that means that you need to count content-length and write it to headers manually
     #[inline]
     pub fn send_data(&mut self,data:ResponseData<'a>){
         let data = data.as_bytes();
         self.write_able_buffer.extend_from_slice(data);
     }
 }

 /// for specifying response data
 pub enum ResponseData<'a> {
     Str(&'static str),
     Slice(&'a [u8]),
     String(String),
 }

impl<'a> ResponseData<'a> {

    pub  fn as_bytes(&'a self)->&'a[u8]{
        match self {
            ResponseData::Str(s) => {s.as_bytes()}
            ResponseData::Slice(s) => {*s}
            ResponseData::String(s) => {s.as_bytes()}
        }
    }
}
unsafe impl<'a>  Send for ResponseData<'a> {

}
#[cfg(test)]
mod test_buffer {
    // use bytes::BytesMut;
    use  water_buffer::WaterBuffer as BM; type BytesMut = BM<u8>;
    use crate::http::status_code::HttpStatusCode as StatusCode;
    use crate::http::HttpVersion;

    #[test]
    pub fn buffer_writing_speed(){
        let status = StatusCode::OK;
        let version = HttpVersion::Http1_1.to_str();


        let v1 = std::time::SystemTime::now();
        let mut buffer =BytesMut::with_capacity(4048);
        buffer.extend_from_slice(version.as_bytes());
        buffer.extend_from_slice(b" ");
        let (code,la) = status.to_bytes();
        buffer.extend_from_slice(format!("{}",code).as_bytes());
        buffer.extend_from_slice(b" ");
        buffer.extend_from_slice(la);
        buffer.extend_from_slice(b"\r\n");
        let v2 = std::time::SystemTime::now();
        let dif = v1.duration_since(v2);
        println!("difference with each writing mod {:?}",dif);

        let v1 = std::time::SystemTime::now();
        let mut buffer =BytesMut::with_capacity(4048);
        buffer.extend_from_slice(
            format!("{} {} {}\r\n",version,status.status,status.label).as_bytes()
        );
        let v2 = std::time::SystemTime::now();
        let dif = v1.duration_since(v2);
        println!("difference with each format mod {:?}",dif);
    }
}