pub mod limits;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use crate::understanding::ActTarget;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum TargetPolicy {
RequiresExistingCase,
RequiresCatalogedCase,
AllowsNewCase,
NewCaseOnly,
ActiveInteractionOnly,
None,
}
impl TargetPolicy {
#[must_use]
pub const fn permits(self, target: &ActTarget) -> bool {
match self {
Self::RequiresExistingCase => matches!(
target,
ActTarget::Record { .. }
| ActTarget::SameTurn { .. }
| ActTarget::NotListed { .. }
| ActTarget::Ambiguous { .. }
),
Self::RequiresCatalogedCase => matches!(
target,
ActTarget::Record { .. }
| ActTarget::SameTurn { .. }
| ActTarget::Ambiguous { .. }
| ActTarget::Card
),
Self::AllowsNewCase => !matches!(target, ActTarget::Card | ActTarget::Nothing),
Self::NewCaseOnly => matches!(target, ActTarget::New { .. }),
Self::ActiveInteractionOnly => matches!(target, ActTarget::Card),
Self::None => true,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ActAvailability {
#[default]
Proposable,
CardOnly,
}
impl ActAvailability {
#[must_use]
pub const fn is_proposable(self) -> bool {
matches!(self, Self::Proposable)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ActMutability {
ReadOnly,
Mutating,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum AnswerBasis {
CurrentCommittedState,
ProposedState,
CommittedStateAfterTurn,
GeneralDomainKnowledge,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::understanding::{ActId, UnitId};
#[test]
fn a_policy_admits_exactly_its_targets() {
let record = ActTarget::Record { token: "t".into() };
let same_turn = ActTarget::SameTurn {
act: ActId::new(UnitId(1), 1),
};
let new = ActTarget::New {
workflow: "w".into(),
};
assert!(TargetPolicy::RequiresExistingCase.permits(&record));
assert!(TargetPolicy::RequiresExistingCase.permits(&same_turn));
assert!(!TargetPolicy::RequiresExistingCase.permits(&new));
assert!(
!TargetPolicy::RequiresCatalogedCase.permits(&ActTarget::NotListed {
workflow: "w".into(),
words: None,
})
);
assert!(TargetPolicy::NewCaseOnly.permits(&new));
assert!(!TargetPolicy::NewCaseOnly.permits(&record));
assert!(TargetPolicy::ActiveInteractionOnly.permits(&ActTarget::Card));
assert!(!TargetPolicy::AllowsNewCase.permits(&ActTarget::Card));
}
}