use edgeworker_sys::cf::Cf as FfiCf;
use edgeworker_sys::cf::TlsClientAuth as FfiTlsClientAuth;
#[derive(Debug)]
pub struct Cf {
inner: FfiCf,
}
impl Cf {
pub fn colo(&self) -> String {
self.inner.colo()
}
pub fn asn(&self) -> u32 {
self.inner.asn()
}
pub fn country(&self) -> Option<String> {
self.inner.country()
}
pub fn http_protocol(&self) -> String {
self.inner.http_protocol()
}
pub fn request_priority(&self) -> Option<RequestPriority> {
if let Some(priority) = self.inner.request_priority() {
let mut weight = 1;
let mut exclusive = false;
let mut group = 0;
let mut group_weight = 0;
priority
.as_str()
.split(';')
.map(|key_value_pair| {
let mut iter = key_value_pair.split('=');
let key = iter.next().unwrap(); let value = iter.next().unwrap();
(key, value)
})
.for_each(|(key, value)| match key {
"weight" => weight = value.parse().unwrap(),
"exclusive" => exclusive = value == "1",
"group" => group = value.parse().unwrap(),
"group-weight" => group_weight = value.parse().unwrap(),
_ => unreachable!(),
});
Some(RequestPriority {
weight,
exclusive,
group,
group_weight,
})
} else {
None
}
}
pub fn tls_cipher(&self) -> String {
self.inner.tls_cipher()
}
pub fn tls_client_auth(&self) -> Option<TlsClientAuth> {
self.inner.tls_client_auth().map(Into::into)
}
pub fn tls_version(&self) -> String {
self.inner.tls_version()
}
pub fn city(&self) -> Option<String> {
self.inner.city()
}
pub fn continent(&self) -> Option<String> {
self.inner.continent()
}
pub fn coordinates(&self) -> Option<(f32, f32)> {
let lat_opt = self.inner.latitude();
let lon_opt = self.inner.longitude();
match (lat_opt, lon_opt) {
(Some(lat_str), Some(lon_str)) => {
let lat = lat_str.parse().unwrap();
let lon = lon_str.parse().unwrap();
Some((lat, lon))
}
_ => None,
}
}
pub fn postal_code(&self) -> Option<String> {
self.inner.postal_code()
}
pub fn metro_code(&self) -> Option<String> {
self.inner.metro_code()
}
pub fn region(&self) -> Option<String> {
self.inner.region()
}
pub fn region_code(&self) -> Option<String> {
self.inner.region_code()
}
pub fn timezone(&self) -> impl chrono::TimeZone {
let tz = self.inner.timezone();
tz.parse::<chrono_tz::Tz>().unwrap()
}
}
#[derive(Debug, Clone, Copy)]
pub struct RequestPriority {
pub weight: usize,
pub exclusive: bool,
pub group: usize,
pub group_weight: usize,
}
impl From<FfiCf> for Cf {
fn from(inner: FfiCf) -> Self {
Self { inner }
}
}
#[derive(Debug)]
pub struct TlsClientAuth {
inner: FfiTlsClientAuth,
}
impl TlsClientAuth {
pub fn cert_issuer_dn_legacy(&self) -> String {
self.inner.cert_issuer_dn_legacy()
}
pub fn cert_issuer_dn(&self) -> String {
self.inner.cert_issuer_dn()
}
pub fn cert_issuer_dn_rfc2253(&self) -> String {
self.inner.cert_issuer_dn_rfc2253()
}
pub fn cert_subject_dn_legacy(&self) -> String {
self.inner.cert_subject_dn_legacy()
}
pub fn cert_verified(&self) -> String {
self.inner.cert_verified()
}
pub fn cert_not_after(&self) -> String {
self.inner.cert_not_after()
}
pub fn cert_subject_dn(&self) -> String {
self.inner.cert_subject_dn()
}
pub fn cert_fingerprint_sha1(&self) -> String {
self.inner.cert_fingerprint_sha1()
}
pub fn cert_not_before(&self) -> String {
self.inner.cert_not_before()
}
pub fn cert_serial(&self) -> String {
self.inner.cert_serial()
}
pub fn cert_presented(&self) -> String {
self.inner.cert_presented()
}
pub fn cert_subject_dn_rfc225(&self) -> String {
self.inner.cert_subject_dn_rfc225()
}
}
impl From<FfiTlsClientAuth> for TlsClientAuth {
fn from(inner: FfiTlsClientAuth) -> Self {
Self { inner }
}
}