use crate::verdicts::{SubgroupVerdict, TotalVerdict};
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Serialize, Deserialize)]
#[cfg_attr(feature = "sqlx", derive(sqlx::Type))]
#[cfg_attr(
feature = "sqlx",
sqlx(type_name = "language", rename_all = "snake_case")
)]
#[serde(rename_all = "snake_case")]
pub enum Language {
Clangpp,
Clang,
Go,
Rust,
Python,
Unknown,
}
#[must_use]
pub const fn get_language_file_extension(language: &Language) -> &'static str {
match language {
Language::Clang => "c",
Language::Clangpp => "cpp",
Language::Go => "go",
Language::Rust => "rs",
Language::Python => "py",
Language::Unknown => "!!",
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SubmissonRequest {
pub problem_id: i64,
pub language: Language,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
pub struct TotalResult {
pub total_verdict: TotalVerdict,
pub total_score: i32,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
pub struct SubgroupResult {
pub subgroup_verdict: SubgroupVerdict,
pub test: i32,
pub score: i32,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
pub struct TestResult {
pub test_verdict: SubgroupVerdict,
pub score: Option<i32>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
pub struct Submission {
pub id: i64,
pub problem_id: i64,
pub user_id: i64,
pub language: Language,
pub total_verdict: TotalVerdict,
pub total_score: i32,
pub created_at: DateTime<Utc>,
pub subgroups_results: Vec<SubgroupResult>,
pub tests_results: Vec<TestResult>,
}