use std::marker::PhantomData;
use std::time::{Duration, SystemTime};
use super::proxy_wasm;
use super::types::{ResponseFlags, TrafficDirection};
use crate::host::ByteString;
struct Path<'a> {
inner: PathKind<'a>,
}
impl<'a> Path<'a> {
pub fn as_ref(&'a self) -> &'a [&'a str] {
self.inner.as_ref()
}
}
enum PathKind<'a> {
Static(&'static [&'static str]),
Custom(Vec<&'a str>),
}
impl<'a> PathKind<'a> {
pub fn as_ref(&'a self) -> &'a [&'a str] {
use PathKind::*;
match self {
Static(ref slice) => slice,
Custom(ref vec) => &vec,
}
}
}
pub(super) struct Property<'a, T, W> {
path: Path<'a>,
_type: PhantomData<T>,
_proxy_wasm_type: PhantomData<W>,
}
impl<'a, T, W> Property<'a, T, W> {
pub fn path(&'a self) -> &'a [&'a str] {
self.path.as_ref()
}
}
pub(super) struct Request {}
impl Request {
pub fn header(name: &str) -> Property<'_, ByteString, proxy_wasm::types::ByteString> {
Property {
path: Path {
inner: PathKind::Custom(vec!["request", "headers", name]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
}
}
pub const ID: &'static Property<'static, String, proxy_wasm::types::ByteString> = &Property {
path: Path {
inner: PathKind::Static(&["request", "id"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const TIME: &'static Property<'static, SystemTime, proxy_wasm::types::Timestamp> =
&Property {
path: Path {
inner: PathKind::Static(&["request", "time"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const DURATION: &'static Property<'static, Duration, proxy_wasm::types::Duration> =
&Property {
path: Path {
inner: PathKind::Static(&["request", "duration"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const SIZE: &'static Property<'static, u64, proxy_wasm::types::Int64> = &Property {
path: Path {
inner: PathKind::Static(&["request", "size"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const TOTAL_SIZE: &'static Property<'static, u64, proxy_wasm::types::Int64> = &Property {
path: Path {
inner: PathKind::Static(&["request", "total_size"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const PROTOCOL: &'static Property<'static, String, proxy_wasm::types::ByteString> =
&Property {
path: Path {
inner: PathKind::Static(&["request", "protocol"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const PATH: &'static Property<'static, String, proxy_wasm::types::ByteString> = &Property {
path: Path {
inner: PathKind::Static(&["request", "path"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const URL_PATH: &'static Property<'static, String, proxy_wasm::types::ByteString> =
&Property {
path: Path {
inner: PathKind::Static(&["request", "url_path"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const HOST: &'static Property<'static, String, proxy_wasm::types::ByteString> = &Property {
path: Path {
inner: PathKind::Static(&["request", "host"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const METHOD: &'static Property<'static, String, proxy_wasm::types::ByteString> =
&Property {
path: Path {
inner: PathKind::Static(&["request", "method"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const SCHEME: &'static Property<'static, String, proxy_wasm::types::ByteString> =
&Property {
path: Path {
inner: PathKind::Static(&["request", "scheme"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const REFERER: &'static Property<'static, ByteString, proxy_wasm::types::ByteString> =
&Property {
path: Path {
inner: PathKind::Static(&["request", "referer"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const USER_AGENT: &'static Property<'static, ByteString, proxy_wasm::types::ByteString> =
&Property {
path: Path {
inner: PathKind::Static(&["request", "useragent"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
}
pub(super) struct Response {}
impl Response {
pub fn header(name: &str) -> Property<'_, ByteString, proxy_wasm::types::ByteString> {
Property {
path: Path {
inner: PathKind::Custom(vec!["response", "headers", name]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
}
}
pub fn trailer(name: &str) -> Property<'_, ByteString, proxy_wasm::types::ByteString> {
Property {
path: Path {
inner: PathKind::Custom(vec!["response", "trailers", name]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
}
}
pub const STATUS_CODE: &'static Property<'static, u16, proxy_wasm::types::Int64> = &Property {
path: Path {
inner: PathKind::Static(&["response", "code"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const SIZE: &'static Property<'static, u64, proxy_wasm::types::Int64> = &Property {
path: Path {
inner: PathKind::Static(&["response", "size"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const TOTAL_SIZE: &'static Property<'static, u64, proxy_wasm::types::Int64> = &Property {
path: Path {
inner: PathKind::Static(&["response", "total_size"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const FLAGS: &'static Property<'static, ResponseFlags, proxy_wasm::types::Int64> =
&Property {
path: Path {
inner: PathKind::Static(&["response", "flags"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const GRPC_STATUS: &'static Property<'static, i32, proxy_wasm::types::Int64> = &Property {
path: Path {
inner: PathKind::Static(&["response", "grpc_status"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
}
pub(super) struct Connection {}
impl Connection {
pub const ID: &'static Property<'static, u64, proxy_wasm::types::UInt64> = &Property {
path: Path {
inner: PathKind::Static(&["connection_id"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const IS_MTLS: &'static Property<'static, bool, proxy_wasm::types::Bool> = &Property {
path: Path {
inner: PathKind::Static(&["connection", "mtls"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const REQUESTED_SERVER_NAME: &'static Property<
'static,
String,
proxy_wasm::types::ByteString,
> = &Property {
path: Path {
inner: PathKind::Static(&["connection", "requested_server_name"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const TLS_VERSION: &'static Property<'static, String, proxy_wasm::types::ByteString> =
&Property {
path: Path {
inner: PathKind::Static(&["connection", "tls_version"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const SUBJECT_LOCAL_CERTIFICATE: &'static Property<
'static,
String,
proxy_wasm::types::ByteString,
> = &Property {
path: Path {
inner: PathKind::Static(&["connection", "subject_local_certificate"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const SUBJECT_PEER_CERTIFICATE: &'static Property<
'static,
String,
proxy_wasm::types::ByteString,
> = &Property {
path: Path {
inner: PathKind::Static(&["connection", "subject_peer_certificate"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const URI_SAN_LOCAL_CERTIFICATE: &'static Property<
'static,
String,
proxy_wasm::types::ByteString,
> = &Property {
path: Path {
inner: PathKind::Static(&["connection", "uri_san_local_certificate"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const URI_SAN_PEER_CERTIFICATE: &'static Property<
'static,
String,
proxy_wasm::types::ByteString,
> = &Property {
path: Path {
inner: PathKind::Static(&["connection", "uri_san_peer_certificate"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const DNS_SAN_LOCAL_CERTIFICATE: &'static Property<
'static,
String,
proxy_wasm::types::ByteString,
> = &Property {
path: Path {
inner: PathKind::Static(&["connection", "dns_san_local_certificate"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const DNS_SAN_PEER_CERTIFICATE: &'static Property<
'static,
String,
proxy_wasm::types::ByteString,
> = &Property {
path: Path {
inner: PathKind::Static(&["connection", "dns_san_peer_certificate"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
}
pub(super) struct Upstream {}
impl Upstream {
pub const ADDRESS: &'static Property<'static, String, proxy_wasm::types::ByteString> =
&Property {
path: Path {
inner: PathKind::Static(&["upstream", "address"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const PORT: &'static Property<'static, u32, proxy_wasm::types::Int64> = &Property {
path: Path {
inner: PathKind::Static(&["upstream", "port"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const LOCAL_ADDRESS: &'static Property<'static, String, proxy_wasm::types::ByteString> =
&Property {
path: Path {
inner: PathKind::Static(&["upstream", "local_address"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const TRANSPORT_FAILURE_REASON: &'static Property<
'static,
String,
proxy_wasm::types::ByteString,
> = &Property {
path: Path {
inner: PathKind::Static(&["upstream", "transport_failure_reason"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const TLS_VERSION: &'static Property<'static, String, proxy_wasm::types::ByteString> =
&Property {
path: Path {
inner: PathKind::Static(&["upstream", "tls_version"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const SUBJECT_LOCAL_CERTIFICATE: &'static Property<
'static,
String,
proxy_wasm::types::ByteString,
> = &Property {
path: Path {
inner: PathKind::Static(&["upstream", "subject_local_certificate"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const SUBJECT_PEER_CERTIFICATE: &'static Property<
'static,
String,
proxy_wasm::types::ByteString,
> = &Property {
path: Path {
inner: PathKind::Static(&["upstream", "subject_peer_certificate"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const URI_SAN_LOCAL_CERTIFICATE: &'static Property<
'static,
String,
proxy_wasm::types::ByteString,
> = &Property {
path: Path {
inner: PathKind::Static(&["upstream", "uri_san_local_certificate"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const URI_SAN_PEER_CERTIFICATE: &'static Property<
'static,
String,
proxy_wasm::types::ByteString,
> = &Property {
path: Path {
inner: PathKind::Static(&["upstream", "uri_san_peer_certificate"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const DNS_SAN_LOCAL_CERTIFICATE: &'static Property<
'static,
String,
proxy_wasm::types::ByteString,
> = &Property {
path: Path {
inner: PathKind::Static(&["upstream", "dns_san_local_certificate"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const DNS_SAN_PEER_CERTIFICATE: &'static Property<
'static,
String,
proxy_wasm::types::ByteString,
> = &Property {
path: Path {
inner: PathKind::Static(&["upstream", "dns_san_peer_certificate"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
}
pub(super) struct Source {}
impl Source {
pub const ADDRESS: &'static Property<'static, String, proxy_wasm::types::ByteString> =
&Property {
path: Path {
inner: PathKind::Static(&["source", "address"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const PORT: &'static Property<'static, u32, proxy_wasm::types::Int64> = &Property {
path: Path {
inner: PathKind::Static(&["source", "port"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
}
pub(super) struct Destination {}
impl Destination {
pub const ADDRESS: &'static Property<'static, String, proxy_wasm::types::ByteString> =
&Property {
path: Path {
inner: PathKind::Static(&["destination", "address"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const PORT: &'static Property<'static, u32, proxy_wasm::types::Int64> = &Property {
path: Path {
inner: PathKind::Static(&["destination", "port"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
}
pub(super) struct Plugin {}
impl Plugin {
pub const NAME: &'static Property<'static, String, proxy_wasm::types::ByteString> = &Property {
path: Path {
inner: PathKind::Static(&["plugin_name"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const ROOT_ID: &'static Property<'static, String, proxy_wasm::types::ByteString> =
&Property {
path: Path {
inner: PathKind::Static(&["plugin_root_id"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
pub const VM_ID: &'static Property<'static, String, proxy_wasm::types::ByteString> =
&Property {
path: Path {
inner: PathKind::Static(&["plugin_vm_id"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
}
pub(super) struct Listener {}
impl Listener {
pub const TRAFFIC_DIRECTION: &'static Property<
'static,
TrafficDirection,
proxy_wasm::types::Int64,
> = &Property {
path: Path {
inner: PathKind::Static(&["listener_direction"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
}
pub(super) struct Cluster {}
impl Cluster {
pub const NAME: &'static Property<'static, String, proxy_wasm::types::ByteString> = &Property {
path: Path {
inner: PathKind::Static(&["cluster_name"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
}
pub(super) struct Route {}
impl Route {
pub const NAME: &'static Property<'static, String, proxy_wasm::types::ByteString> = &Property {
path: Path {
inner: PathKind::Static(&["route_name"]),
},
_type: PhantomData,
_proxy_wasm_type: PhantomData,
};
}