use super::EncodeSink;
use super::HeaderFieldSource;
use super::HeaderFieldSpec;
use super::HeaderFlattenSpec;
use super::ProtocolContractViolation;
use super::ResolvedHeaderKey;
use crate::HeaderMap;
pub trait HeaderCodec: Sized {
const TYPE_ID: &'static str;
const HEADER_NAME: &'static str;
const JAVA_CLASS: Option<&'static str>;
const FIELD_COUNT_HINT: usize;
const LOCAL_FIELD_SPECS: &'static [HeaderFieldSpec];
const LOCAL_FLATTEN_SPECS: &'static [HeaderFlattenSpec];
const FAST_ENABLED: bool;
fn validate_for_wire(&self) -> Result<(), ProtocolContractViolation>;
fn encode_into<S: EncodeSink>(&self, sink: &mut S) -> Result<(), ProtocolContractViolation>;
fn decode_from_map(map: &HeaderMap) -> Result<Self, ProtocolContractViolation>;
#[inline]
fn decode_from_source(source: &dyn HeaderFieldSource) -> Result<Self, ProtocolContractViolation> {
let map = source.to_header_map();
Self::decode_from_map(&map)
}
fn contains_any_field(map: &HeaderMap) -> bool;
#[inline]
fn contains_any_field_source(source: &dyn HeaderFieldSource) -> bool {
let mut contains = false;
source.visit_fields_while(&mut |key, _value| {
if Self::contains_wire_key(key) {
contains = true;
false
} else {
true
}
});
contains
}
fn encoded_len_hint(&self) -> usize;
fn visit_field_specs(visitor: &mut dyn FnMut(&HeaderFieldSpec));
fn visit_flatten_specs(visitor: &mut dyn FnMut(&HeaderFlattenSpec));
fn resolve_wire_key(key: &str) -> Option<ResolvedHeaderKey>;
#[inline]
fn canonical_wire_key(key: &str) -> Option<&'static str> {
Self::resolve_wire_key(key).map(|resolved| resolved.canonical)
}
#[inline]
fn contains_wire_key(key: &str) -> bool {
Self::resolve_wire_key(key).is_some()
}
}