grid_tariffs/
country.rs

1use core::fmt;
2use std::str::FromStr;
3
4use chrono::NaiveDate;
5use serde::{Deserialize, Serialize};
6
7use crate::helpers::date;
8
9#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
10#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
11pub enum Country {
12    SE,
13}
14
15impl Country {
16    pub const fn all() -> &'static [Self] {
17        &[Country::SE]
18    }
19
20    pub(crate) const fn vat_rate(&self) -> f64 {
21        match self {
22            Country::SE => 1.25,
23        }
24    }
25
26    pub(crate) const fn add_vat(&self, value: f64) -> f64 {
27        value * self.vat_rate()
28    }
29
30    pub(crate) fn is_holiday(&self, date_naive: NaiveDate) -> bool {
31        SE_HOLIDAYS.contains(&date_naive)
32    }
33}
34
35impl Country {
36    pub fn code(&self) -> &'static str {
37        match self {
38            Country::SE => "SE",
39        }
40    }
41
42    pub fn english_name(&self) -> &'static str {
43        match self {
44            Country::SE => "Sweden",
45        }
46    }
47}
48
49impl FromStr for Country {
50    type Err = &'static str;
51
52    fn from_str(s: &str) -> Result<Self, Self::Err> {
53        match s.to_ascii_uppercase().as_ref() {
54            "SE" => Ok(Country::SE),
55            _ => Err("no such country"),
56        }
57    }
58}
59
60impl fmt::Display for Country {
61    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
62        f.write_str(match self {
63            Country::SE => "SE",
64        })
65    }
66}
67
68static SE_HOLIDAYS: &[NaiveDate] = &[
69    date(2025, 1, 1),
70    date(2025, 1, 6),
71    date(2025, 4, 18),
72    date(2025, 4, 20),
73    date(2025, 4, 21),
74    date(2025, 5, 1),
75    date(2025, 5, 29),
76    date(2025, 6, 6),
77    date(2025, 6, 8),
78    date(2025, 6, 21),
79    date(2025, 11, 1),
80    date(2025, 12, 24),
81    date(2025, 12, 25),
82    date(2025, 12, 26),
83    date(2025, 12, 31),
84    date(2026, 1, 1),
85    date(2026, 1, 6),
86    date(2026, 4, 3),
87    date(2026, 4, 5),
88    date(2026, 4, 6),
89    date(2026, 5, 1),
90    date(2026, 5, 14),
91    date(2026, 5, 24),
92    date(2026, 6, 6),
93    date(2026, 6, 20),
94    date(2026, 10, 31),
95    date(2026, 12, 24),
96    date(2026, 12, 25),
97    date(2026, 12, 26),
98    date(2026, 12, 31),
99    date(2027, 1, 1),
100    date(2027, 1, 6),
101    date(2027, 3, 26),
102    date(2027, 3, 28),
103    date(2027, 3, 29),
104    date(2027, 5, 1),
105    date(2027, 5, 6),
106    date(2027, 5, 16),
107    date(2027, 6, 6),
108    date(2027, 6, 26),
109    date(2027, 11, 6),
110    date(2027, 12, 24),
111    date(2027, 12, 25),
112    date(2027, 12, 26),
113    date(2027, 12, 31),
114    date(2028, 1, 1),
115    date(2028, 1, 6),
116    date(2028, 4, 14),
117    date(2028, 4, 16),
118    date(2028, 4, 17),
119    date(2028, 5, 1),
120    date(2028, 5, 25),
121    date(2028, 6, 4),
122    date(2028, 6, 6),
123    date(2028, 6, 24),
124    date(2028, 11, 4),
125    date(2028, 12, 24),
126    date(2028, 12, 25),
127    date(2028, 12, 26),
128    date(2028, 12, 31),
129];