use std::fmt::{Display};
use water_buffer::WaterBuffer as BM; type BytesMut = BM<u8>;
use crate::http::status_code::HttpStatusCode as StatusCode;
pub struct HttpResponseBufferWriter<'a> {
write_able_buffer:&'a mut BytesMut
}
impl<'a> HttpResponseBufferWriter<'a> {
#[inline]
pub fn success(buffer:&'a mut BytesMut)->HttpResponseBufferWriter<'a>{
Self::with_version_and_status(buffer,StatusCode::OK)
}
pub fn new(buffer:&'a mut BytesMut)->HttpResponseBufferWriter<'a>{
HttpResponseBufferWriter{
write_able_buffer:buffer
}
}
#[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
}
}
#[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()
);
}
#[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);
}
#[inline]
pub fn send_data(&mut self,data:ResponseData<'a>){
let data = data.as_bytes();
self.write_able_buffer.extend_from_slice(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> {
}