use std::collections::HashMap;
use serde::Deserialize;
use crate::rubric::Criterion;
#[derive(Deserialize)]
pub struct RubricYaml {
pub name: String,
pub desc: Option<String>,
pub criteria: HashMap<String, CriterionYaml>,
pub total: Option<isize>,
pub deadline: Option<String>,
pub final_deadline: Option<String>,
pub allow_late: Option<bool>,
pub late_penalty: Option<isize>,
pub late_penalty_per_day: Option<isize>,
}
#[derive(Deserialize)]
pub struct CriterionYaml {
func: Option<String>,
index: Option<i64>,
desc: Option<String>,
worth: isize,
messages: Option<(String, String)>,
hide: Option<bool>,
}
impl CriterionYaml {
pub fn into_criterion(self, name: String) -> Criterion {
let mut builder = Criterion::new(&name).worth(self.worth);
if let Some(msg) = self.messages {
builder = builder.messages(&msg.0, &msg.1)
}
if let Some(func) = self.func {
builder = builder.func(&func)
}
if let Some(h) = self.hide {
builder = builder.hide(h)
}
if let Some(desc) = self.desc {
builder = builder.desc(&desc)
}
if let Some(index) = self.index {
builder = builder.index(index);
}
builder.build()
}
}