1use crate::verdicts::{TestingVerdict, Verdict};
2use chrono::{DateTime, Utc};
3use serde::{Deserialize, Serialize};
4
5#[derive(Clone, Debug, Serialize, Deserialize)]
6#[cfg_attr(feature = "sqlx", derive(sqlx::Type))]
7#[cfg_attr(
8 feature = "sqlx",
9 sqlx(type_name = "language", rename_all = "snake_case")
10)]
11#[serde(rename_all = "snake_case")]
12pub enum Language {
13 C,
14 Cpp,
15 Go,
16 Rust,
17 Python,
18 FreePascal,
19 Unknown,
20}
21
22impl Language {
23 #[must_use]
24 pub const fn file_ext(&self) -> &'static str {
25 match &self {
26 Self::C => "c",
27 Self::Cpp => "cpp",
28 Self::Go => "go",
29 Self::Rust => "rs",
30 Self::Python => "py",
31 Self::FreePascal => "pas",
32 Self::Unknown => "!!",
33 }
34 }
35}
36
37#[derive(Clone, Debug, Serialize, Deserialize)]
38pub struct SubmissonRequest {
39 pub language: Language,
40}
41
42#[derive(Clone, Debug, Serialize, Deserialize)]
43#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
44pub struct TestingResult {
45 pub verdict: TestingVerdict,
46 pub score: f64,
47}
48
49#[derive(Clone, Debug, Serialize, Deserialize)]
50#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
51pub struct SubgroupResult {
52 pub verdict: Verdict,
53 pub test: i32,
54 pub score: f64,
55}
56
57#[derive(Clone, Debug, Serialize, Deserialize)]
58#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
59pub struct TestResult {
60 pub verdict: Verdict,
61 pub score: Option<f64>,
62}
63
64#[derive(Clone, Debug, Serialize, Deserialize)]
65#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
66pub struct Submission {
67 pub id: i64,
68 pub problem_id: i64,
69 pub user_id: i64,
70 pub user_login: String,
71 pub language: Language,
72 pub verdict: TestingVerdict,
73 pub score: f64,
74 pub subgroups_results: Vec<SubgroupResult>,
75 pub tests_results: Vec<TestResult>,
76 pub created_at: DateTime<Utc>,
77}