use tls_codec::{TlsDeserialize, TlsSerialize, TlsSize, TlsVecU8};
use crate::messages::proposals::ProposalType;
use super::{Deserialize, ExtensionError, ExtensionType, Serialize};
#[derive(
PartialEq, Clone, Debug, Default, Serialize, Deserialize, TlsSerialize, TlsDeserialize, TlsSize,
)]
pub struct RequiredCapabilitiesExtension {
extensions: TlsVecU8<ExtensionType>,
proposals: TlsVecU8<ProposalType>,
}
impl RequiredCapabilitiesExtension {
pub fn new(extensions: &[ExtensionType], proposals: &[ProposalType]) -> Self {
Self {
extensions: extensions.into(),
proposals: proposals.into(),
}
}
pub(crate) fn extensions(&self) -> &[ExtensionType] {
self.extensions.as_slice()
}
pub(crate) fn proposals(&self) -> &[ProposalType] {
self.proposals.as_slice()
}
pub(crate) fn check_support(&self) -> Result<(), ExtensionError> {
for extension in self.extensions() {
if !extension.is_supported() {
return Err(ExtensionError::UnsupportedExtensionType);
}
}
for proposal in self.proposals() {
if !proposal.is_supported() {
return Err(ExtensionError::UnsupportedProposalType);
}
}
Ok(())
}
}