#[cfg(feature = "aws")]
mod aws;
#[cfg(feature = "azure")]
mod azure;
#[cfg(any(feature = "aws", feature = "azure", feature = "gcp"))]
use crate::error::TlvParseError;
#[cfg(any(feature = "aws", feature = "azure", feature = "gcp"))]
use crate::types::Tlvs;
#[cfg(feature = "aws")]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AwsTlvs {
pub vpc_endpoint_id: Option<String>,
pub raw: Vec<(u8, Vec<u8>)>,
}
#[cfg(feature = "azure")]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AzureTlvs {
pub private_endpoint_link_id: Option<u32>,
pub raw: Vec<(u8, Vec<u8>)>,
}
#[cfg(feature = "gcp")]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct GcpTlvs {
pub psc_connection_id: u64,
}
#[cfg(feature = "aws")]
impl Tlvs {
pub fn aws(&self) -> Option<Result<AwsTlvs, TlvParseError>> {
self.raw
.iter()
.find(|(t, _)| *t == 0xEA)
.map(|(_, value)| aws::parse_aws_tlv(value))
}
}
#[cfg(feature = "azure")]
impl Tlvs {
pub fn azure(&self) -> Option<Result<AzureTlvs, TlvParseError>> {
self.raw
.iter()
.find(|(t, _)| *t == 0xEE)
.map(|(_, value)| azure::parse_azure_tlv(value))
}
}
#[cfg(feature = "gcp")]
impl Tlvs {
pub fn gcp(&self) -> Option<Result<GcpTlvs, TlvParseError>> {
self.raw.iter().find(|(t, _)| *t == 0xE0).map(|(_, value)| {
if value.len() != 8 {
return Err(TlvParseError::InvalidValue {
reason: format!("GCP PSC connection ID must be 8 bytes, got {}", value.len()),
});
}
let psc_connection_id = u64::from_be_bytes(value.as_slice().try_into().unwrap());
Ok(GcpTlvs { psc_connection_id })
})
}
}