use super::AwsTlvs;
use crate::error::TlvParseError;
const PP2_SUBTYPE_AWS_VPCE_ID: u8 = 0x01;
fn is_valid_vpce_id(s: &str) -> bool {
s.bytes().all(|b| b.is_ascii_alphanumeric() || b == b'-')
}
pub(crate) fn parse_aws_tlv(data: &[u8]) -> Result<AwsTlvs, TlvParseError> {
if data.is_empty() {
return Err(TlvParseError::MalformedSubTlv { offset: 0 });
}
let sub_type = data[0];
let value = &data[1..];
let mut aws = AwsTlvs {
vpc_endpoint_id: None,
raw: vec![(sub_type, value.to_vec())],
};
if sub_type == PP2_SUBTYPE_AWS_VPCE_ID {
let vpce = String::from_utf8(value.to_vec()).map_err(|_| TlvParseError::InvalidValue {
reason: "VPC endpoint ID is not valid UTF-8".to_string(),
})?;
if !is_valid_vpce_id(&vpce) {
return Err(TlvParseError::InvalidValue {
reason: format!("VPC endpoint ID contains invalid characters: {:?}", vpce),
});
}
aws.vpc_endpoint_id = Some(vpce);
}
Ok(aws)
}