1#[cfg(any(feature = "admin-osm", feature = "tz-ned", feature = "tz-osm"))]
4use serde::{Deserialize, Serialize};
5
6#[cfg(feature = "web")]
7use utoipa::ToSchema;
8
9#[cfg(feature = "wasm")]
10use tsify::Tsify;
11
12#[cfg(feature = "admin-osm")]
13use rtz_core::geo::admin::osm::OsmAdmin;
14#[cfg(feature = "tz-ned")]
15use rtz_core::geo::tz::ned::NedTimezone;
16#[cfg(feature = "tz-osm")]
17use rtz_core::geo::tz::osm::OsmTimezone;
18
19#[cfg(feature = "tz-ned")]
23#[derive(Debug, Serialize, Deserialize)]
24#[cfg_attr(feature = "web", derive(ToSchema))]
25#[cfg_attr(feature = "wasm", derive(Tsify))]
26#[serde(rename_all = "camelCase")]
27pub struct NedTimezoneResponse1 {
28 pub id: usize,
32 pub identifier: Option<&'static str>,
34
35 pub description: &'static str,
37 pub dst_description: Option<&'static str>,
39
40 pub offset: &'static str,
42
43 pub zone: f32,
45 pub raw_offset: i32,
47}
48
49#[cfg(feature = "tz-ned")]
50impl From<&'static NedTimezone> for NedTimezoneResponse1 {
51 fn from(value: &'static NedTimezone) -> NedTimezoneResponse1 {
52 NedTimezoneResponse1 {
53 id: value.id,
54 identifier: value.identifier.as_deref(),
55 description: value.description.as_ref(),
56 dst_description: value.dst_description.as_deref(),
57 offset: value.offset.as_ref(),
58 zone: value.zone,
59 raw_offset: value.raw_offset,
60 }
61 }
62}
63
64#[cfg(feature = "tz-osm")]
68#[derive(Debug, Serialize, Deserialize)]
69#[cfg_attr(feature = "web", derive(ToSchema))]
70#[cfg_attr(feature = "wasm", derive(Tsify))]
71#[serde(rename_all = "camelCase")]
72pub struct OsmTimezoneResponse1 {
73 pub id: usize,
77 pub identifier: &'static str,
79 pub short_identifier: String,
81
82 pub offset: String,
84
85 pub raw_offset: i32,
87 pub raw_base_offset: i32,
89 pub raw_dst_offset: i32,
91
92 pub zone: f32,
94
95 pub current_time: String,
97}
98
99#[cfg(feature = "tz-osm")]
100impl From<&'static OsmTimezone> for OsmTimezoneResponse1 {
101 fn from(value: &'static OsmTimezone) -> OsmTimezoneResponse1 {
102 use chrono::{Offset, Utc};
103 use chrono_tz::{OffsetComponents, Tz};
104
105 let tz: Tz = value.identifier.parse().unwrap();
106 let time = Utc::now().with_timezone(&tz);
107 let tz_offset = time.offset();
108 let fixed_offset = tz_offset.fix();
109
110 let short_identifier = tz_offset.to_string();
111
112 let offset = format!("UTC{}", fixed_offset);
113 let raw_offset = fixed_offset.local_minus_utc();
114 let raw_base_offset = tz_offset.base_utc_offset().num_seconds() as i32;
115 let raw_dst_offset = tz_offset.dst_offset().num_seconds() as i32;
116
117 let zone = raw_offset as f32 / 3600.0;
118
119 let current_time = time.to_rfc3339();
120
121 OsmTimezoneResponse1 {
122 id: value.id,
123 identifier: value.identifier.as_ref(),
124 short_identifier,
125 offset,
126 raw_offset,
127 raw_base_offset,
128 raw_dst_offset,
129 zone,
130 current_time,
131 }
132 }
133}
134
135#[cfg(feature = "admin-osm")]
142#[derive(Debug, Serialize, Deserialize)]
143#[cfg_attr(feature = "web", derive(ToSchema))]
144#[cfg_attr(feature = "wasm", derive(Tsify))]
145#[serde(rename_all = "camelCase")]
146pub struct OsmAdminResponse1 {
147 pub id: usize,
151
152 pub relation_id: Option<u64>,
155
156 pub name: &'static str,
158
159 pub level: usize,
161}
162
163#[cfg(feature = "admin-osm")]
164impl From<&'static OsmAdmin> for OsmAdminResponse1 {
165 fn from(value: &'static OsmAdmin) -> OsmAdminResponse1 {
166 OsmAdminResponse1 {
167 id: value.id,
168 relation_id: (value.relation_id != 0).then_some(value.relation_id),
169 name: value.name.as_ref(),
170 level: value.level,
171 }
172 }
173}