use hyper2::{Priority, PseudoOrder, SettingsOrder, StreamDependency, StreamId};
use std::borrow::Cow;
use typed_builder::TypedBuilder;
#[derive(Clone, Debug, TypedBuilder)]
pub struct Http2Config {
#[builder(default, setter(into))]
pub initial_stream_id: Option<u32>,
#[builder(default, setter(into))]
pub initial_connection_window_size: Option<u32>,
#[builder(default, setter(into))]
pub header_table_size: Option<u32>,
#[builder(default, setter(into))]
pub enable_push: Option<bool>,
#[builder(default, setter(into))]
pub max_concurrent_streams: Option<u32>,
#[builder(default, setter(into))]
pub initial_stream_window_size: Option<u32>,
#[builder(default, setter(into))]
pub max_frame_size: Option<u32>,
#[builder(default, setter(into))]
pub max_header_list_size: Option<u32>,
#[builder(default, setter(into))]
pub unknown_setting8: Option<bool>,
#[builder(default, setter(into))]
pub unknown_setting9: Option<bool>,
#[builder(default, setter(strip_option))]
pub settings_order: Option<[SettingsOrder; 8]>,
#[builder(default, setter(transform = |input: impl IntoStreamDependency| input.into()))]
pub headers_priority: Option<StreamDependency>,
#[builder(default, setter(into))]
pub headers_pseudo_order: Option<[PseudoOrder; 4]>,
#[builder(default, setter(strip_option, into))]
pub priority: Option<Cow<'static, [Priority]>>,
}
pub trait IntoStreamDependency {
fn into(self) -> Option<StreamDependency>;
}
macro_rules! impl_into_stream_dependency {
($($t:ty => $body:expr),*) => {
$(
impl IntoStreamDependency for $t {
fn into(self) -> Option<StreamDependency> {
$body(self)
}
}
)*
};
}
impl_into_stream_dependency!(
(u32, u8, bool) => |(id, weight, exclusive)| Some(StreamDependency::new(StreamId::from(id), weight, exclusive)),
Option<(u32, u8, bool)> => |opt: Option<(u32, u8, bool)>| opt.map(|(id, weight, exclusive)| StreamDependency::new(StreamId::from(id), weight, exclusive)),
StreamDependency => Some,
Option<StreamDependency> => |opt| opt
);