use std::{
collections::BTreeMap,
sync::{Arc, Mutex},
};
use async_trait::async_trait;
use crate::{
Answer, JudgmentProvider, JudgmentRequest, JudgmentResponse, JudgmentSource, JudgmentUsage,
};
#[derive(Debug, Clone)]
pub struct FixedJudgment {
answers: BTreeMap<String, Answer>,
requests: Arc<Mutex<Vec<JudgmentRequest>>>,
}
impl FixedJudgment {
#[must_use]
pub fn new(answers: BTreeMap<String, Answer>) -> Self {
Self {
answers,
requests: Arc::new(Mutex::new(Vec::new())),
}
}
#[must_use]
pub fn noul(id: &str, noul: f64) -> Self {
let mut answers = BTreeMap::new();
answers.insert(id.to_owned(), Answer::Noul { noul });
Self::new(answers)
}
#[must_use]
pub fn requests(&self) -> Vec<JudgmentRequest> {
self.requests.lock().expect("request log poisoned").clone()
}
}
#[derive(Debug, thiserror::Error)]
#[error("the fixed judgment stub never fails")]
pub struct StubError;
#[async_trait]
impl JudgmentProvider for FixedJudgment {
type Error = StubError;
async fn judge(&self, request: JudgmentRequest) -> Result<JudgmentResponse, Self::Error> {
self.requests
.lock()
.expect("request log poisoned")
.push(request);
Ok(JudgmentResponse {
model: "fixed".to_owned(),
answers: self.answers.clone(),
usage: JudgmentUsage::default(),
source: JudgmentSource::Primary,
})
}
}
#[derive(Debug, Clone, Copy, Default)]
pub struct FailingJudgment;
#[derive(Debug, thiserror::Error)]
#[error("the failing judgment stub refuses every request")]
pub struct FailingError;
#[async_trait]
impl JudgmentProvider for FailingJudgment {
type Error = FailingError;
async fn judge(&self, _: JudgmentRequest) -> Result<JudgmentResponse, Self::Error> {
Err(FailingError)
}
}