use serde::{Deserialize, Serialize};
use crate::constants::PROTOCOL_VERSION;
use crate::report::{PeerIdentity, REPORT_SCHEMA_VERSION};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum TestTransport {
TcpRaw,
UdpBlaster,
Http1,
H2c,
Http2Tls,
Http3,
QuicRaw,
}
impl TestTransport {
pub fn label(&self) -> &'static str {
match self {
TestTransport::TcpRaw => "tcp",
TestTransport::UdpBlaster => "udp",
TestTransport::Http1 => "http1",
TestTransport::H2c => "h2c",
TestTransport::Http2Tls => "http2",
TestTransport::Http3 => "http3",
TestTransport::QuicRaw => "quic",
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListenerEntry {
pub transport: TestTransport,
pub host: String,
pub port: u16,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServerManifest {
pub protocol_version: u32,
pub report_schema_version: u32,
pub server_identity: PeerIdentity,
pub listeners: Vec<ListenerEntry>,
}
impl ServerManifest {
pub fn new(listeners: Vec<ListenerEntry>) -> Self {
Self {
protocol_version: PROTOCOL_VERSION,
report_schema_version: REPORT_SCHEMA_VERSION,
server_identity: PeerIdentity::local(),
listeners,
}
}
pub fn listener(&self, transport: TestTransport) -> Option<&ListenerEntry> {
self.listeners.iter().find(|l| l.transport == transport)
}
}