use thiserror::Error;
#[derive(Debug, Error)]
#[error("MiniMax dedicated engine not implemented: {reason}")]
pub struct MinimaxUnavailable {
pub reason: &'static str,
}
pub struct MinimaxEngine {
pub arch: String,
}
impl MinimaxEngine {
pub fn reject(arch: &str) -> Result<(), MinimaxUnavailable> {
let reason = match crate::capability::resolve_architecture(arch) {
Some(crate::capability::ArchPath::DedicatedOnly { reason }) => reason,
_ => {
return Err(MinimaxUnavailable {
reason: "not a MiniMax architecture: expected `minimax-m2` or `minimax-m3`, \
which the capability catalog marks DedicatedOnly",
});
}
};
Err(MinimaxUnavailable { reason })
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn reject_is_fail_closed() {
assert!(MinimaxEngine::reject("minimax-m2").is_err());
assert!(MinimaxEngine::reject("minimax-m3").is_err());
}
#[test]
fn reject_repeats_the_catalog_reason_verbatim() {
for arch in ["minimax-m2", "minimax-m3"] {
let Some(crate::capability::ArchPath::DedicatedOnly { reason }) =
crate::capability::resolve_architecture(arch)
else {
panic!("{arch} must be DedicatedOnly");
};
let err = MinimaxEngine::reject(arch).unwrap_err();
assert_eq!(
err.reason, reason,
"{arch}: the engine must not carry a second, different reason"
);
}
}
#[test]
fn no_minimax_reason_blames_mtp() {
for arch in ["minimax-m2", "minimax-m3"] {
let err = MinimaxEngine::reject(arch).unwrap_err();
let lower = err.reason.to_ascii_lowercase();
assert!(
!lower.contains("mtp") && !lower.contains("nextn"),
"{arch} may not be refused for MTP it cannot have: {}",
err.reason
);
}
}
#[test]
fn a_non_minimax_name_is_named_as_such() {
let err = MinimaxEngine::reject("llama").unwrap_err();
assert!(err.reason.contains("not a MiniMax architecture"));
}
}