reqrio 0.3.0-rc2

A lightweight, high-performance, fingerprint-based HTTP request library.
Documentation
use std::fmt::Display;
use crate::cookie::CookieManager;
use crate::packet::http::content_type::ContentType;
use crate::packet::http::cookie::Cookie;

#[derive(Clone)]
pub enum HeaderValue {
    String(String),
    Bool(bool),
    Number(usize),
    ContextType(ContentType),
    Cookies(CookieManager),
}

impl HeaderValue {
    pub fn add_cookie(&mut self, cookie: Cookie) {
        if let HeaderValue::Cookies(cookies) = self {
            cookies.push(cookie);
        }
    }

    pub fn as_string(&self) -> Option<&str> {
        match self {
            HeaderValue::String(v) => Some(v),
            _ => None
        }
    }

    pub fn is_empty(&self) -> bool {
        match self {
            HeaderValue::String(v) => v.is_empty(),
            HeaderValue::Bool(_) => false,
            HeaderValue::Number(v) => *v == 0,
            HeaderValue::ContextType(_) => false,
            HeaderValue::Cookies(v) => v.is_empty(),
        }
    }

    pub fn may_len(&self) -> usize {
        match self {
            HeaderValue::String(v) => v.len(),
            HeaderValue::Bool(_) => 1,
            HeaderValue::Number(_) => 10,
            HeaderValue::ContextType(_) => 64,
            HeaderValue::Cookies(cookies) => cookies.req_may_len()
        }
    }
}

impl Display for HeaderValue {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            HeaderValue::String(v) => f.write_str(v),
            HeaderValue::Bool(v) => f.write_str(if *v { "1" } else { "0" }),
            HeaderValue::Number(v) => f.write_str(v.to_string().as_str()),
            HeaderValue::ContextType(v) => f.write_str(v.to_string().as_str()),
            HeaderValue::Cookies(v) => write!(f, "{}", v)
        }
    }
}