use crate::domain::acp::version::AcpVersion;
pub const N_FEATURES: usize = 7;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum AcpFeature {
SessionPrompt,
SessionCancel,
SessionLoad,
FsAccess,
TerminalAccess,
Elicitation,
CancelRequest,
}
impl AcpFeature {
pub const ALL: [Self; N_FEATURES] = [
Self::SessionPrompt,
Self::SessionCancel,
Self::SessionLoad,
Self::FsAccess,
Self::TerminalAccess,
Self::Elicitation,
Self::CancelRequest,
];
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct AcpFeatureProfile {
pub version: AcpVersion,
pub features: [bool; N_FEATURES],
}
impl AcpFeatureProfile {
pub const EMPTY: Self = Self {
version: AcpVersion::V1_25_0,
features: [false; N_FEATURES],
};
pub const V1_25_0: Self = Self {
version: AcpVersion::V1_25_0,
features: [true; N_FEATURES],
};
pub const fn supports(self, feature: AcpFeature) -> bool {
match feature {
AcpFeature::SessionPrompt => self.features[0],
AcpFeature::SessionCancel => self.features[1],
AcpFeature::SessionLoad => self.features[2],
AcpFeature::FsAccess => self.features[3],
AcpFeature::TerminalAccess => self.features[4],
AcpFeature::Elicitation => self.features[5],
AcpFeature::CancelRequest => self.features[6],
}
}
}
#[cfg(test)]
mod tests {
use super::*;
fn assert_supports(profile: AcpFeatureProfile, feature: AcpFeature, expected: bool) {
assert_eq!(
profile.supports(feature),
expected,
"feature {feature:?} on {profile:?}"
);
}
#[test]
fn the_v1_25_0_canonical_profile_is_every_feature_on() {
let profile = AcpFeatureProfile::V1_25_0;
for feature in AcpFeature::ALL {
assert_supports(profile, feature, true);
}
}
#[test]
fn the_empty_profile_is_every_feature_off() {
let profile = AcpFeatureProfile::EMPTY;
for feature in AcpFeature::ALL {
assert_supports(profile, feature, false);
}
}
#[test]
fn feature_variant_count_matches_n_features() {
assert_eq!(AcpFeature::ALL.len(), N_FEATURES);
}
}