use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum GradingPolicy {
Template(TemplatePolicy),
Formula(FormulaPolicy),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TemplatePolicy {
pub template: String,
#[serde(default = "default_lower")]
pub lower: f64,
#[serde(default = "default_upper")]
pub upper: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FormulaPolicy {
pub formula: String,
}
impl Default for GradingPolicy {
fn default() -> Self {
Self::Template(TemplatePolicy {
template: "sqrt".to_string(),
lower: 60.0,
upper: 100.0,
})
}
}
fn default_lower() -> f64 {
60.0
}
fn default_upper() -> f64 {
100.0
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CourseConfig {
pub course: CourseInfo,
#[serde(default)]
pub grading: GradingPolicy,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CourseInfo {
pub name: String,
#[serde(default = "default_language")]
pub language: String,
}
fn default_language() -> String {
"python".to_string()
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AssignmentConfig {
pub assignment: AssignmentInfo,
#[serde(default)]
pub files: Vec<FilePattern>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AssignmentInfo {
pub name: String,
#[serde(default = "default_tests_dir")]
pub tests_dir: String,
}
fn default_tests_dir() -> String {
"tests".to_string()
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FilePattern {
pub pattern: String,
}