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 FreePascal,
28 Unknown,
30}
31
32#[must_use]
34pub const fn get_language_file_extension(language: &Language) -> &'static str {
35 match language {
36 Language::Clang => "c",
37 Language::Clangpp => "cpp",
38 Language::Go => "go",
39 Language::Rust => "rs",
40 Language::Python => "py",
41 Language::FreePascal => "pas",
42 Language::Unknown => "!!",
43 }
44}
45
46#[derive(Clone, Debug, Serialize, Deserialize)]
48pub struct SubmissonRequest {
49 pub problem_id: i64,
51 pub language: Language,
53}
54
55#[derive(Clone, Debug, Serialize, Deserialize)]
57#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
58pub struct TotalResult {
59 pub total_verdict: TotalVerdict,
61 pub total_score: i32,
63}
64
65#[derive(Clone, Debug, Default, Serialize, Deserialize)]
67#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
68pub struct SubgroupResult {
69 pub subgroup_verdict: SubgroupVerdict,
71 pub test: i32,
73 pub score: i32,
75}
76
77#[derive(Clone, Debug, Default, Serialize, Deserialize)]
79#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
80pub struct TestResult {
81 pub test_verdict: SubgroupVerdict,
83 pub score: Option<i32>,
85}
86
87#[derive(Clone, Debug, Serialize, Deserialize)]
89#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
90pub struct Submission {
91 pub id: i64,
93 pub problem_id: i64,
95 pub user_id: i64,
97 pub language: Language,
99 pub total_verdict: TotalVerdict,
101 pub total_score: i32,
103 pub created_at: DateTime<Utc>,
105 pub subgroups_results: Vec<SubgroupResult>,
107 pub tests_results: Vec<TestResult>,
109}