reqrio 0.3.0-rc2

A lightweight, high-performance, fingerprint-based HTTP request library.
Documentation
use crate::error::HlsResult;
use std::fmt::{Debug, Formatter};
use reqtls::{BufferError, ReadExt, Reader, WriteExt};

#[derive(PartialEq, Copy, Clone)]
#[repr(u16)]
pub enum H2Setting {
    HeaderTableSize(u32) = 0x1,
    EnablePush(u32) = 0x2,
    MaxConcurrentStreams(u32) = 0x3,
    InitialWindowSize(u32) = 0x4,
    MaxFrameSize(u32) = 0x5,
    MaxHeaderListSize(u32) = 0x6,
    Reserved { flag: u16, value: u32 },
}

impl H2Setting {
    pub fn from_reader(reader: &mut Reader<'_>) -> HlsResult<H2Setting> {
        let flag = reader.read_u16()?;
        let value = reader.read_u32()?;
        Ok(match flag {
            0x1 => H2Setting::HeaderTableSize(value),
            0x2 => H2Setting::EnablePush(value),
            0x3 => H2Setting::MaxConcurrentStreams(value),
            0x4 => H2Setting::InitialWindowSize(value),
            0x5 => H2Setting::MaxFrameSize(value),
            0x6 => H2Setting::MaxHeaderListSize(value),
            _ => H2Setting::Reserved { flag, value },
        })
    }

    pub fn write_to<W: WriteExt>(&self, writer: &mut W) -> Result<(), BufferError> {
        let (flag, value) = match self {
            H2Setting::HeaderTableSize(v) => (0x1, v),
            H2Setting::EnablePush(v) => (0x2, v),
            H2Setting::MaxConcurrentStreams(v) => (0x3, v),
            H2Setting::InitialWindowSize(v) => (0x4, v),
            H2Setting::MaxFrameSize(v) => (0x5, v),
            H2Setting::MaxHeaderListSize(v) => (0x6, v),
            H2Setting::Reserved { flag, value } => (*flag, value),
        };
        writer.write_u16(flag)?;
        writer.write_ru32(value)
    }

    pub fn value(&self) -> &u32 {
        match self {
            H2Setting::HeaderTableSize(v) => v,
            H2Setting::EnablePush(v) => v,
            H2Setting::MaxConcurrentStreams(v) => v,
            H2Setting::InitialWindowSize(v) => v,
            H2Setting::MaxFrameSize(v) => v,
            H2Setting::MaxHeaderListSize(v) => v,
            H2Setting::Reserved { value, .. } => value
        }
    }
}

impl Debug for H2Setting {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        match self {
            H2Setting::HeaderTableSize(v) => write!(f, "HeaderTableSize({})", v),
            H2Setting::EnablePush(v) => write!(f, "EnablePush({})", v),
            H2Setting::MaxConcurrentStreams(v) => write!(f, "MaxConcurrentStreams({})", v),
            H2Setting::InitialWindowSize(v) => write!(f, "InitialWindowSize({})", v),
            H2Setting::MaxFrameSize(v) => write!(f, "MaxFrameSize({})", v),
            H2Setting::MaxHeaderListSize(v) => write!(f, "MaxHeaderListSize({})", v),
            H2Setting::Reserved { flag, value } => write!(f, "Reserved{{flag: {}; value: {}}}", flag, value),
        }
    }
}