1
use axum::Json;
2
use axum::response::IntoResponse;
3
use serde::Deserialize;
4

            
5
use crate::pages::HtmlTemplate;
6
use crate::pages::validation::feedback::ValidationFeedback;
7

            
8
#[derive(Deserialize)]
9
pub struct FractionValidation {
10
    fraction: Option<String>, // Change to string to handle all input types
11
}
12

            
13
pub async fn validate_fraction(Json(form): Json<FractionValidation>) -> impl IntoResponse {
14
    let fraction_str = match &form.fraction {
15
        Some(s) if !s.trim().is_empty() => s,
16
        _ => return HtmlTemplate(ValidationFeedback::error(t!("Fraction is required"))),
17
    };
18

            
19
    let fraction = match fraction_str.parse::<i64>() {
20
        Ok(num) => num,
21
        Err(_) => {
22
            return HtmlTemplate(ValidationFeedback::error(t!("Please enter a valid number")));
23
        }
24
    };
25

            
26
    if fraction <= 0 {
27
        return HtmlTemplate(ValidationFeedback::error(
28
            "Fraction must be greater than zero",
29
        ));
30
    }
31

            
32
    if fraction > 1_000_000_000 {
33
        return HtmlTemplate(ValidationFeedback::error(t!("Fraction value is too large")));
34
    }
35

            
36
    HtmlTemplate(ValidationFeedback::success(t!("Ok")))
37
}
38

            
39
#[derive(Deserialize)]
40
pub struct SymbolValidation {
41
    symbol: Option<String>,
42
}
43

            
44
pub async fn validate_symbol(Json(form): Json<SymbolValidation>) -> impl IntoResponse {
45
    let symbol = match form.symbol {
46
        Some(s) => s,
47
        None => return HtmlTemplate(ValidationFeedback::error(t!("Symbol is required"))),
48
    };
49

            
50
    if symbol.is_empty() {
51
        return HtmlTemplate(ValidationFeedback::error(t!("Symbol cannot be empty")));
52
    }
53

            
54
    if symbol.len() > 20 {
55
        return HtmlTemplate(ValidationFeedback::error(
56
            "Symbol cannot exceed 20 characters",
57
        ));
58
    }
59

            
60
    HtmlTemplate(ValidationFeedback::success(t!("Ok")))
61
}
62

            
63
#[derive(Deserialize)]
64
pub struct FullnameValidation {
65
    name: Option<String>,
66
}
67

            
68
pub async fn validate_name(Json(form): Json<FullnameValidation>) -> impl IntoResponse {
69
    let name = match form.name {
70
        Some(n) => n,
71
        None => return HtmlTemplate(ValidationFeedback::notice(t!("Full name is recommended"))),
72
    };
73

            
74
    if name.is_empty() {
75
        return HtmlTemplate(ValidationFeedback::notice(t!("Full name is recommended")));
76
    }
77

            
78
    if name.len() < 2 {
79
        return HtmlTemplate(ValidationFeedback::error(t!("Full name is too short")));
80
    }
81

            
82
    if name.len() > 100 {
83
        return HtmlTemplate(ValidationFeedback::error(t!("Full name is too long")));
84
    }
85

            
86
    HtmlTemplate(ValidationFeedback::success(t!("Ok")))
87
}