accuweather/
types.rs

1//! All types needed for Accuweather Api
2extern crate serde_derive;
3extern crate serde_json;
4use std::fmt;
5
6/// Type for most of Accuweather forecasts value
7#[derive(Deserialize)]
8#[serde(rename_all = "PascalCase")]
9pub struct AccuweatherMeasurement {
10    /// the actual value
11    pub value: f32,
12    /// the unit
13    pub unit: String,
14    /// Accuweather internal unit representation
15    unit_type: i32,
16}
17
18impl AccuweatherMeasurement {
19    pub fn print(&self) {
20        println!("{} {}", self.value, self.unit);
21    }
22}
23
24impl fmt::Debug for AccuweatherMeasurement {
25    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
26        write!(f, "{} {} ({})", self.value, self.unit, self.unit_type)
27    }
28}
29
30impl fmt::Display for AccuweatherMeasurement {
31    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
32        write!(f, "{} {}", self.value, self.unit)
33    }
34}
35
36/// Represntation of Air and Pollen information
37#[derive(Deserialize, Debug)]
38#[serde(rename_all = "PascalCase")]
39pub struct AirAndPollen {
40    pub name: String,
41    pub value: i32,
42    pub category: String,
43    category_value: i32,
44    #[serde(default = "air_pollen_default_type")]
45    r#type: String,
46}
47
48/// Representation of wind direction
49#[derive(Deserialize, Debug)]
50#[serde(rename_all = "PascalCase")]
51pub struct WindDirection {
52    pub degrees: f32,
53    pub localized: String,
54    pub english: String,
55}
56
57/// Represnetation of Wind in forecasts api
58#[derive(Deserialize, Debug)]
59#[serde(rename_all = "PascalCase")]
60pub struct Wind {
61    pub speed: AccuweatherMeasurement,
62    pub direction: WindDirection,
63}
64
65/// Representation of wind gust in daily forecasts api
66#[derive(Deserialize, Debug)]
67#[serde(rename_all = "PascalCase")]
68pub struct DailyWindGust {
69    speed: AccuweatherMeasurement,
70}
71
72/// Representation of temperature in daily forecast
73#[derive(Deserialize, Debug)]
74#[serde(rename_all = "PascalCase")]
75pub struct Temperature {
76    pub maximum: AccuweatherMeasurement,
77    pub minimum: AccuweatherMeasurement,
78}
79
80/// Represention of forecast for a day part (either night or day) in daily forecast api.
81#[derive(Deserialize, Debug)]
82#[serde(rename_all = "PascalCase")]
83pub struct DayPartForecast {
84    pub cloud_cover: i32,
85    pub hours_of_precipitation: f32,
86    pub hours_of_rain: f32,
87    pub ice: AccuweatherMeasurement,
88    pub ice_probability: i32,
89    pub icon: i32,
90    pub icon_phrase: String,
91    pub long_phrase: String,
92    pub precipitation_probability: i32,
93    pub rain: AccuweatherMeasurement,
94    pub rain_probability: i32,
95    pub short_phrase: String,
96    pub snow: AccuweatherMeasurement,
97    pub snow_probability: i32,
98    pub thunderstorm_probability: i32,
99    pub total_liquid: AccuweatherMeasurement,
100    pub wind: Wind,
101    pub wind_gust: Wind,
102}
103
104/// Representation of degree day summary in daily forecast api.
105#[derive(Deserialize, Debug)]
106#[serde(rename_all = "PascalCase")]
107pub struct DegreeDaySummary {
108    pub heating: AccuweatherMeasurement,
109    pub cooling: AccuweatherMeasurement,
110}
111
112/// Representation of Sun information in daily forecast api.
113#[derive(Deserialize, Debug)]
114#[serde(rename_all = "PascalCase")]
115pub struct Sun {
116    pub rise: String,
117    pub epoch_rise: i64,
118    pub set: String,
119    pub epoch_set: i64,
120}
121
122/// Representation of Moon information in daily forecast api.
123#[derive(Deserialize, Debug)]
124#[serde(rename_all = "PascalCase")]
125pub struct Moon {
126    pub rise: String,
127    pub epoch_rise: i64,
128    pub set: String,
129    pub epoch_set: i64,
130    pub phase: String,
131    pub age: i32,
132}
133
134/// Representation of daily forecast
135#[derive(Deserialize, Debug)]
136#[serde(rename_all = "PascalCase")]
137pub struct DailyForecast {
138    pub air_and_pollen: Vec<AirAndPollen>,
139    pub date: String,
140    pub day: DayPartForecast,
141    pub degree_day_summary: DegreeDaySummary,
142    pub epoch_date: i64,
143    pub hours_of_sun: f32,
144    pub link: String,
145    pub mobile_link: String,
146    pub moon: Moon,
147    pub night: DayPartForecast,
148    pub real_feel_temperature: Temperature,
149    pub real_feel_temperature_shade: Temperature,
150    pub sources: Vec<String>,
151    pub sun: Sun,
152    pub temperature: Temperature,
153}
154
155/// Representation of the Headline part of daily forecast api answer
156#[derive(Deserialize, Debug)]
157#[serde(rename_all = "PascalCase")]
158pub struct Headline {
159    pub effective_date: String,
160    pub effective_epoch_date: i64,
161    pub severity: i32,
162    pub text: String,
163    pub category: String,
164    pub end_date: String,
165    pub end_epoch_date: i64,
166    pub mobile_link: String,
167    pub link: String,
168}
169
170/// Representation of daily forecast api answer
171#[derive(Deserialize, Debug)]
172#[serde(rename_all = "PascalCase")]
173pub struct DailyForecastsAnswer {
174    pub headline: Headline,
175    pub daily_forecasts: Vec<DailyForecast>,
176}
177
178fn air_pollen_default_type() -> String {
179    "".to_string()
180}
181
182/// Representation of an hourly forecast
183#[derive(Deserialize, Debug)]
184#[serde(rename_all = "PascalCase")]
185pub struct HourlyForecast {
186    pub ceiling: AccuweatherMeasurement,
187    pub cloud_cover: i32,
188    pub date_time: String,
189    pub dew_point: AccuweatherMeasurement,
190    pub epoch_date_time: i64,
191    pub ice: AccuweatherMeasurement,
192    pub ice_probability: i32,
193    pub icon_phrase: String,
194    pub is_daylight: bool,
195    pub link: String,
196    pub mobile_link: String,
197    pub precipitation_probability: i32,
198    pub rain: AccuweatherMeasurement,
199    pub rain_probability: i32,
200    pub real_feel_temperature: AccuweatherMeasurement,
201    pub relative_humidity: i32,
202    pub snow: AccuweatherMeasurement,
203    pub snow_probability: i32,
204    pub temperature: AccuweatherMeasurement,
205    pub total_liquid: AccuweatherMeasurement,
206    #[serde(rename = "UVIndex")]
207    pub uv_index: i32,
208    #[serde(rename = "UVIndexText")]
209    pub uv_index_text: String,
210    pub visibility: AccuweatherMeasurement,
211    pub weather_icon: i32,
212    pub wet_bulb_temperature: AccuweatherMeasurement,
213    pub wind: Wind,
214    pub wind_gust: DailyWindGust,
215}
216
217/// Representation of LocalSource for current condition api.
218#[derive(Deserialize, Debug)]
219#[serde(rename_all = "PascalCase")]
220pub struct LocalSource {
221    pub id: i32,
222    pub name: String,
223    pub weather_code: String,
224}
225
226/// Representation of a measurement in current condition api.
227#[derive(Deserialize, Debug)]
228#[serde(rename_all = "PascalCase")]
229pub struct ConditionMeasurement {
230    pub metric: AccuweatherMeasurement,
231    pub imperial: AccuweatherMeasurement,
232}
233
234/// Representation of pressure tendency in current condition api.
235#[derive(Deserialize, Debug)]
236#[serde(rename_all = "PascalCase")]
237pub struct PressureTendency {
238    pub localized_text: String,
239    pub code: String,
240}
241
242/// Reprensentation of preciipiation summary in current condition api.
243#[derive(Deserialize, Debug)]
244#[serde(rename_all = "PascalCase")]
245pub struct PrecipitationSummary {
246    pub precipitation: ConditionMeasurement,
247    pub past_hour: ConditionMeasurement,
248    pub past3_hours: ConditionMeasurement,
249    pub past6_hours: ConditionMeasurement,
250    pub past9_hours: ConditionMeasurement,
251    pub past12_hours: ConditionMeasurement,
252    pub past18_hours: ConditionMeasurement,
253    pub past24_hours: ConditionMeasurement,
254}
255
256/// Representation of temperature summary in current condition api.
257#[derive(Deserialize, Debug)]
258#[serde(rename_all = "PascalCase")]
259pub struct TemperatureSummary {
260    pub past6_hour_range: TemperatureSummaryRange,
261    pub past12_hour_range: TemperatureSummaryRange,
262    pub past24_hour_range: TemperatureSummaryRange,
263}
264
265/// Representation of temperature summary during a rang of time in current condition api.
266#[derive(Deserialize, Debug)]
267#[serde(rename_all = "PascalCase")]
268pub struct TemperatureSummaryRange {
269    pub minimum: ConditionMeasurement,
270    pub maximum: ConditionMeasurement,
271}
272
273/// Representation of wind in current condition api.
274#[derive(Deserialize, Debug)]
275#[serde(rename_all = "PascalCase")]
276pub struct WindCondition {
277    pub speed: ConditionMeasurement,
278    pub direction: WindDirection,
279}
280
281/// Representation of wind gust in current condition api.
282#[derive(Deserialize, Debug)]
283#[serde(rename_all = "PascalCase")]
284pub struct ConditionWindGust {
285    pub speed: ConditionMeasurement,
286}
287
288/// Representation of Current Condion in current condition api.
289#[derive(Deserialize, Debug)]
290#[serde(rename_all = "PascalCase")]
291pub struct CurrentCondition {
292    pub local_observation_date_time: String,
293    pub epoch_time: i64,
294    pub weather_text: String,
295    pub weather_icon: i32,
296    pub local_source: Option<LocalSource>,
297    pub is_day_time: bool,
298    pub temperature: ConditionMeasurement,
299    pub real_feel_temperature: ConditionMeasurement,
300    pub real_feel_temperature_shade: ConditionMeasurement,
301    pub relative_humidity: i32,
302    pub dew_point: ConditionMeasurement,
303    pub wind: WindCondition,
304    pub wind_gust: ConditionWindGust,
305    #[serde(rename = "UVIndex")]
306    pub uv_index: i32,
307    #[serde(rename = "UVIndexText")]
308    pub uv_index_text: String,
309    pub visibility: ConditionMeasurement,
310    pub obstructions_to_visibility: String,
311    pub cloud_cover: i32,
312    pub ceiling: ConditionMeasurement,
313    pub pressure: ConditionMeasurement,
314    pub pressure_tendency: PressureTendency,
315    pub past24_hour_temperature_departure: ConditionMeasurement,
316    pub apparent_temperature: ConditionMeasurement,
317    pub wind_chill_temperature: ConditionMeasurement,
318    pub wet_bulb_temperature: ConditionMeasurement,
319    pub precip1hr: ConditionMeasurement,
320    pub precipitation_summary: PrecipitationSummary,
321    pub temperature_summary: TemperatureSummary,
322    pub mobile_link: String,
323    pub link: String,
324    pub has_precipitation: bool,
325    pub precipitation_type: Option<String>,
326}