use agent_client_protocol::schema::v1::{
PermissionOption, PermissionOptionKind, RequestPermissionOutcome, SelectedPermissionOutcome,
};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) enum PermissionDecision {
AllowOnce,
Reject,
}
pub(crate) fn choose_option(
decision: PermissionDecision,
options: &[PermissionOption],
) -> RequestPermissionOutcome {
let allowed = match decision {
PermissionDecision::AllowOnce => options
.iter()
.find(|option| option.kind == PermissionOptionKind::AllowOnce),
PermissionDecision::Reject => None,
};
allowed
.or_else(|| {
options
.iter()
.find(|option| option.kind == PermissionOptionKind::RejectOnce)
})
.map_or(RequestPermissionOutcome::Cancelled, |option| {
RequestPermissionOutcome::Selected(SelectedPermissionOutcome::new(
option.option_id.clone(),
))
})
}
pub(super) fn is_allowed(outcome: &RequestPermissionOutcome, options: &[PermissionOption]) -> bool {
match outcome {
RequestPermissionOutcome::Selected(selected) => options.iter().any(|option| {
option.option_id == selected.option_id && option.kind == PermissionOptionKind::AllowOnce
}),
RequestPermissionOutcome::Cancelled => false,
_ => false,
}
}
#[cfg(test)]
#[path = "permission_tests.rs"]
mod tests;