1use crate::verdicts::{SubgroupVerdict, TotalVerdict};
4use chrono::{DateTime, Utc};
5use serde::{Deserialize, Serialize};
6
7#[derive(Clone, Debug, Serialize, Deserialize)]
9#[cfg_attr(feature = "sqlx", derive(sqlx::Type))]
10#[cfg_attr(
11 feature = "sqlx",
12 sqlx(type_name = "language", rename_all = "snake_case")
13)]
14#[serde(rename_all = "snake_case")]
15pub enum Language {
16 Clangpp,
18 Clang,
20 Go,
22 Rust,
24 Python,
26 Unknown,
28}
29
30#[must_use]
32pub const fn get_language_file_extension(language: &Language) -> &'static str {
33 match language {
34 Language::Clang => "c",
35 Language::Clangpp => "cpp",
36 Language::Go => "go",
37 Language::Rust => "rs",
38 Language::Python => "py",
39 Language::Unknown => "!!",
40 }
41}
42
43#[derive(Clone, Debug, Serialize, Deserialize)]
45pub struct SubmissonRequest {
46 pub problem_id: i64,
48 pub language: Language,
50}
51
52#[derive(Clone, Debug, Serialize, Deserialize)]
54#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
55pub struct TotalResult {
56 pub total_verdict: TotalVerdict,
58 pub total_score: i32,
60}
61
62#[derive(Clone, Debug, Default, Serialize, Deserialize)]
64#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
65pub struct SubgroupResult {
66 pub subgroup_verdict: SubgroupVerdict,
68 pub test: i32,
70 pub score: i32,
72}
73
74#[derive(Clone, Debug, Default, Serialize, Deserialize)]
76#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
77pub struct TestResult {
78 pub test_verdict: SubgroupVerdict,
80 pub score: Option<i32>,
82}
83
84#[derive(Clone, Debug, Serialize, Deserialize)]
86#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
87pub struct Submission {
88 pub id: i64,
90 pub problem_id: i64,
92 pub user_id: i64,
94 pub language: Language,
96 pub total_verdict: TotalVerdict,
98 pub total_score: i32,
100 pub created_at: DateTime<Utc>,
102 pub subgroups_results: Vec<SubgroupResult>,
104 pub tests_results: Vec<TestResult>,
106}