use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum Tier {
#[default]
Heuristic,
HeuristicSummarization,
HeuristicSummarizationEmbedding,
}
impl Tier {
#[must_use]
pub fn as_str(self) -> &'static str {
match self {
Self::Heuristic => "heuristic",
Self::HeuristicSummarization => "heuristic_summarization",
Self::HeuristicSummarizationEmbedding => "heuristic_summarization_embedding",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct CapabilityProbe {
pub summarizer: bool,
pub embedder: bool,
}
impl CapabilityProbe {
#[must_use]
pub fn offline() -> Self {
Self::default()
}
#[must_use]
pub fn active_tier(self) -> Tier {
match (self.summarizer, self.embedder) {
(true, true) => Tier::HeuristicSummarizationEmbedding,
(true, false) => Tier::HeuristicSummarization,
(false, true) => Tier::HeuristicSummarizationEmbedding,
(false, false) => Tier::Heuristic,
}
}
#[must_use]
pub fn reason(self) -> &'static str {
match (self.summarizer, self.embedder) {
(true, true) => "summarizer_and_embedder_present",
(true, false) => "summarizer_present",
(false, true) => "embedder_present",
(false, false) => "heuristic_only",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn offline_is_heuristic() {
assert_eq!(CapabilityProbe::offline().active_tier(), Tier::Heuristic);
}
#[test]
fn summarizer_only_unlocks_tier1() {
let p = CapabilityProbe {
summarizer: true,
embedder: false,
};
assert_eq!(p.active_tier(), Tier::HeuristicSummarization);
}
#[test]
fn both_unlocks_tier2() {
let p = CapabilityProbe {
summarizer: true,
embedder: true,
};
assert_eq!(p.active_tier(), Tier::HeuristicSummarizationEmbedding);
}
#[test]
fn embedder_only_unlocks_embedding_tier() {
let p = CapabilityProbe {
summarizer: false,
embedder: true,
};
assert_eq!(p.active_tier(), Tier::HeuristicSummarizationEmbedding);
}
}