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];