rust_flightplan/
types.rs

1////////////////////////////////////////////////////////////////////////////////////////////////////
2// MIT License                                                                                     /
3//                                                                                                 /
4// Copyright (c) 2024 Rust-FlightPlan Team                                                         /
5//                                                                                                 /
6// Permission is hereby granted, free of charge, to any person obtaining a copy                    /
7// of this software and associated documentation files (the "Software"), to deal                   /
8// in the Software without restriction, including without limitation the rights                    /
9// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell                       /
10// copies of the Software, and to permit persons to whom the Software is                           /
11// furnished to do so, subject to the following conditions:                                        /
12//                                                                                                 /
13// The above copyright notice and this permission notice shall be included in all                  /
14// copies or substantial portions of the Software.                                                 /
15//                                                                                                 /
16// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR                      /
17// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,                        /
18// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE                     /
19// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER                          /
20// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,                   /
21// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE                   /
22// SOFTWARE.                                                                                       /
23////////////////////////////////////////////////////////////////////////////////////////////////////
24
25use crate::converter::bool_from_str;
26use crate::converter::f32_from_str;
27use crate::converter::f64_from_str;
28use crate::converter::i16_from_str;
29use crate::converter::i32_from_str;
30use crate::converter::i8_from_str;
31use crate::converter::option_f64_from_str;
32use crate::converter::option_i8_from_str_wind_comp;
33use crate::converter::option_u16_from_str;
34use crate::converter::option_u32_from_str;
35use crate::converter::option_u8_from_str;
36use crate::converter::ts_from_string;
37use crate::converter::u16_from_str;
38use crate::converter::u32_from_str;
39use crate::converter::u8_from_str;
40use chrono::{DateTime, Utc};
41use serde::{Deserialize, Serialize};
42
43#[derive(Serialize, Deserialize, Debug, Clone)]
44pub struct Ofp {
45    pub fetch: Fetch,
46    pub params: Params,
47    pub general: General,
48    pub origin: Airport,
49    pub destination: Airport,
50    #[serde(alias = "alternate")]
51    pub alternates: Option<Vec<Airport>>,
52    pub takeoff_altn: Option<Airport>,
53    pub enroute_altn: Option<Airport>,
54    pub navlog: Option<Navlog>,
55    pub etops: Option<Etops>,
56    pub tlr: Option<Tlr>,
57    pub atc: Option<Atc>,
58    pub aircraft: Aircraft,
59    pub fuel: Fuel,
60    pub fuel_extra: FuelExtra,
61    pub times: Times,
62    pub weights: Weights,
63    pub impacts: Option<Impacts>,
64    pub crew: Crew,
65    pub notams: Option<Notams>,
66    pub weather: Weather,
67    pub sigmets: Option<Sigmets>,
68}
69
70#[derive(Serialize, Deserialize, Debug, Clone)]
71pub struct Fetch {
72    #[serde(alias = "userid", deserialize_with = "u32_from_str")]
73    pub user_id: u32,
74    pub static_id: Option<String>,
75    pub status: String,
76    #[serde(deserialize_with = "f32_from_str")]
77    pub time: f32,
78}
79
80#[derive(Serialize, Deserialize, Debug, Clone)]
81pub struct Params {
82    #[serde(deserialize_with = "u32_from_str")]
83    pub request_id: u32,
84    pub sequence_id: String,
85    #[serde(deserialize_with = "u32_from_str")]
86    pub user_id: u32,
87    #[serde(deserialize_with = "u32_from_str")]
88    pub time_generated: u32,
89    pub static_id: Option<String>,
90    pub xml_file: String,
91    pub ofp_layout: String,
92    pub airac: String,
93    pub units: String,
94}
95
96#[derive(Serialize, Deserialize, Debug, Clone)]
97pub struct General {
98    #[serde(deserialize_with = "u8_from_str")]
99    pub release: u8,
100    pub icao_airline: String,
101    pub flight_number: String,
102    #[serde(deserialize_with = "bool_from_str")]
103    pub is_etops: bool,
104    pub dx_rmk: Vec<String>,
105    pub sys_rmk: Option<String>,
106    #[serde(deserialize_with = "bool_from_str")]
107    pub is_detailed_profile: bool,
108    pub cruise_profile: String,
109    pub climb_profile: String,
110    pub descent_profile: String,
111    pub alternate_profile: String,
112    pub reserve_profile: String,
113    #[serde(deserialize_with = "u16_from_str")]
114    pub costindex: u16,
115    pub cont_rule: String,
116    #[serde(deserialize_with = "u16_from_str")]
117    pub initial_altitude: u16,
118    pub stepclimb_string: String,
119    #[serde(deserialize_with = "i8_from_str")]
120    pub avg_temp_dev: i8,
121    #[serde(deserialize_with = "u16_from_str")]
122    pub avg_tropopause: u16,
123    #[serde(deserialize_with = "i8_from_str")]
124    pub avg_wind_comp: i8,
125    #[serde(deserialize_with = "u16_from_str")]
126    pub avg_wind_dir: u16,
127    #[serde(deserialize_with = "u8_from_str")]
128    pub avg_wind_spd: u8,
129    #[serde(deserialize_with = "u16_from_str")]
130    pub gc_distance: u16,
131    #[serde(deserialize_with = "u16_from_str")]
132    pub route_distance: u16,
133    #[serde(deserialize_with = "u16_from_str")]
134    pub air_distance: u16,
135    #[serde(deserialize_with = "u32_from_str")]
136    pub total_burn: u32,
137    #[serde(deserialize_with = "u16_from_str")]
138    pub cruise_tas: u16,
139    pub cruise_mach: String,
140    #[serde(deserialize_with = "u16_from_str")]
141    pub passengers: u16,
142    pub route: String,
143    pub route_ifps: String,
144    pub route_navigraph: String,
145}
146
147#[derive(Serialize, Deserialize, Debug, Clone)]
148pub struct Airport {
149    pub icao_code: String,
150    pub iata_code: String,
151    pub faa_code: Option<String>,
152    pub icao_region: String,
153    #[serde(deserialize_with = "i16_from_str")]
154    pub elevation: i16,
155    #[serde(deserialize_with = "f64_from_str")]
156    pub pos_lat: f64,
157    #[serde(deserialize_with = "f64_from_str")]
158    pub pos_long: f64,
159    pub name: String,
160    #[serde(deserialize_with = "i8_from_str")]
161    pub timezone: i8,
162    pub plan_rwy: Option<String>,
163    #[serde(deserialize_with = "u16_from_str")]
164    pub trans_alt: u16,
165    #[serde(deserialize_with = "u16_from_str")]
166    pub trans_level: u16,
167    #[serde(default, deserialize_with = "option_u16_from_str")]
168    pub cruise_altitude: Option<u16>,
169    #[serde(default, deserialize_with = "option_u16_from_str")]
170    pub distance: Option<u16>,
171    #[serde(default, deserialize_with = "option_u16_from_str")]
172    pub gc_distance: Option<u16>,
173    #[serde(default, deserialize_with = "option_u16_from_str")]
174    pub air_distance: Option<u16>,
175    #[serde(default, deserialize_with = "option_u16_from_str")]
176    pub track_true: Option<u16>,
177    #[serde(default, deserialize_with = "option_u16_from_str")]
178    pub track_mag: Option<u16>,
179    #[serde(default, deserialize_with = "option_u16_from_str")]
180    pub tas: Option<u16>,
181    #[serde(default, deserialize_with = "option_u16_from_str")]
182    pub gs: Option<u16>,
183    #[serde(default, deserialize_with = "option_i8_from_str_wind_comp")]
184    pub avg_wind_comp: Option<i8>,
185    #[serde(default, deserialize_with = "option_u16_from_str")]
186    pub avg_wind_dir: Option<u16>,
187    #[serde(default, deserialize_with = "option_u8_from_str")]
188    pub avg_wind_spd: Option<u8>,
189    #[serde(default, deserialize_with = "option_u16_from_str")]
190    pub avg_tropopause: Option<u16>,
191    pub avg_tdv: Option<String>,
192    #[serde(default, deserialize_with = "option_u16_from_str")]
193    pub ete: Option<u16>,
194    #[serde(default, deserialize_with = "option_u16_from_str")]
195    pub burn: Option<u16>,
196    pub route: Option<String>,
197    pub route_ifps: Option<String>,
198    pub metar: String,
199    pub metar_time: Option<DateTime<Utc>>,
200    pub metar_category: Option<String>,
201    #[serde(default, deserialize_with = "option_u16_from_str")]
202    pub metar_visibility: Option<u16>,
203    #[serde(default, deserialize_with = "option_u16_from_str")]
204    pub metar_ceiling: Option<u16>,
205    pub taf: String,
206    pub taf_time: Option<DateTime<Utc>>,
207    pub atis: Option<Vec<Atis>>,
208    pub notam: Option<Vec<Notam>>,
209    pub fcst_cig: Option<String>,
210    pub fcst_vis: Option<String>,
211}
212
213#[derive(Serialize, Deserialize, Debug, Clone)]
214pub struct Atis {
215    pub network: String,
216    pub issued: Option<DateTime<Utc>>,
217    pub letter: Option<String>,
218    pub phonetic: Option<String>,
219    #[serde(alias = "type")]
220    pub variant: String,
221    pub message: String,
222}
223
224#[derive(Serialize, Deserialize, Debug, Clone)]
225pub struct Notam {
226    pub source_id: String,
227    pub account_id: String,
228    #[serde(alias = "notam_id")]
229    pub id: String,
230    pub location_id: String,
231    pub location_icao: String,
232    pub location_name: String,
233    pub location_type: String,
234    pub date_created: DateTime<Utc>,
235    pub date_effective: DateTime<Utc>,
236    pub date_expire: Option<DateTime<Utc>>,
237    #[serde(default, deserialize_with = "bool_from_str")]
238    pub date_expire_is_estimated: bool,
239    pub date_modified: DateTime<Utc>,
240    #[serde(alias = "notam_schedule")]
241    pub schedule: Option<String>,
242    #[serde(alias = "notam_html")]
243    pub html: String,
244    #[serde(alias = "notam_text")]
245    pub text: String,
246    #[serde(alias = "notam_raw")]
247    pub raw: String,
248    #[serde(alias = "notam_nrc")]
249    pub nrc: String,
250    #[serde(alias = "notam_qcode")]
251    pub qcode: Option<String>,
252    #[serde(alias = "notam_qcode_category")]
253    pub qcode_category: String,
254    #[serde(alias = "notam_qcode_subject")]
255    pub qcode_subject: Option<String>,
256    #[serde(alias = "notam_qcode_status")]
257    pub qcode_status: Option<String>,
258    #[serde(
259        default,
260        alias = "notam_is_obstacle",
261        deserialize_with = "bool_from_str"
262    )]
263    pub is_obstacle: bool,
264}
265
266#[derive(Serialize, Deserialize, Debug, Clone)]
267pub struct Navlog {
268    #[serde(alias = "fix")]
269    pub fixes: Vec<Fix>,
270}
271
272#[derive(Serialize, Deserialize, Debug, Clone)]
273pub struct Fix {
274    pub ident: String,
275    pub name: String,
276    #[serde(alias = "type")]
277    pub variant: String,
278    pub icao_region: Option<String>,
279    #[serde(default, deserialize_with = "option_f64_from_str")]
280    pub frequency: Option<f64>,
281    #[serde(deserialize_with = "f64_from_str")]
282    pub pos_lat: f64,
283    #[serde(deserialize_with = "f64_from_str")]
284    pub pos_long: f64,
285    pub stage: String,
286    pub via_airway: String,
287    #[serde(deserialize_with = "bool_from_str")]
288    pub is_sid_star: bool,
289    #[serde(deserialize_with = "u16_from_str")]
290    pub distance: u16,
291    #[serde(deserialize_with = "u16_from_str")]
292    pub track_true: u16,
293    #[serde(deserialize_with = "u16_from_str")]
294    pub track_mag: u16,
295    #[serde(deserialize_with = "u16_from_str")]
296    pub heading_true: u16,
297    #[serde(deserialize_with = "u16_from_str")]
298    pub heading_mag: u16,
299    #[serde(deserialize_with = "u16_from_str")]
300    pub altitude_feet: u16,
301    #[serde(deserialize_with = "u16_from_str")]
302    pub ind_airspeed: u16,
303    #[serde(deserialize_with = "u16_from_str")]
304    pub true_airspeed: u16,
305    pub mach: String,
306    pub mach_thousandths: String,
307    #[serde(deserialize_with = "i8_from_str")]
308    pub wind_component: i8,
309    #[serde(deserialize_with = "u16_from_str")]
310    pub groundspeed: u16,
311    #[serde(deserialize_with = "u16_from_str")]
312    pub time_leg: u16,
313    #[serde(deserialize_with = "u16_from_str")]
314    pub time_total: u16,
315    #[serde(deserialize_with = "u16_from_str")]
316    pub fuel_flow: u16,
317    #[serde(deserialize_with = "u32_from_str")]
318    pub fuel_leg: u32,
319    #[serde(deserialize_with = "u32_from_str")]
320    pub fuel_totalused: u32,
321    #[serde(deserialize_with = "u32_from_str")]
322    pub fuel_min_onboard: u32,
323    #[serde(deserialize_with = "u32_from_str")]
324    pub fuel_plan_onboard: u32,
325    #[serde(deserialize_with = "i8_from_str")]
326    pub oat: i8,
327    #[serde(deserialize_with = "i8_from_str")]
328    pub oat_isa_dev: i8,
329    #[serde(deserialize_with = "u16_from_str")]
330    pub wind_dir: u16,
331    #[serde(deserialize_with = "u16_from_str")]
332    pub wind_spd: u16,
333    #[serde(deserialize_with = "u16_from_str")]
334    pub shear: u16,
335    #[serde(deserialize_with = "u16_from_str")]
336    pub tropopause_feet: u16,
337    #[serde(deserialize_with = "u16_from_str")]
338    pub ground_height: u16,
339    #[serde(deserialize_with = "u16_from_str")]
340    pub mora: u16,
341    pub fir: String,
342    pub fir_units: String,
343    pub fir_valid_levels: String,
344    pub wind_data: FixWind,
345    pub fir_crossing: Option<FirCrossing>,
346}
347
348#[derive(Serialize, Deserialize, Debug, Clone)]
349pub struct FixWind {
350    pub level: Vec<FixWindLevel>,
351}
352
353#[derive(Serialize, Deserialize, Debug, Clone)]
354pub struct FixWindLevel {
355    #[serde(deserialize_with = "u16_from_str")]
356    pub altitude: u16,
357    #[serde(deserialize_with = "u16_from_str")]
358    pub wind_dir: u16,
359    #[serde(deserialize_with = "u8_from_str")]
360    pub wind_spd: u8,
361    #[serde(deserialize_with = "i8_from_str")]
362    pub oat: i8,
363}
364
365#[derive(Serialize, Deserialize, Debug, Clone)]
366pub struct FirCrossing {
367    pub fir: Vec<Fir>,
368}
369
370#[derive(Serialize, Deserialize, Debug, Clone)]
371pub struct Fir {
372    #[serde(alias = "fir_icao")]
373    pub icao: String,
374    #[serde(alias = "fir_name")]
375    pub name: String,
376    #[serde(deserialize_with = "f64_from_str")]
377    pub pos_lat_entry: f64,
378    #[serde(deserialize_with = "f64_from_str")]
379    pub pos_long_entry: f64,
380}
381
382#[derive(Serialize, Deserialize, Debug, Clone)]
383pub struct Etops {
384    pub rule: String,
385    pub entry: EtopsAirport,
386    pub exit: EtopsAirport,
387    pub suitable_airport: Vec<Airport>,
388}
389
390#[derive(Serialize, Deserialize, Debug, Clone)]
391pub struct EtopsAirport {
392    pub icao_code: String,
393    pub iata_code: String,
394    pub faa_code: Option<String>,
395    pub icao_region: String,
396    #[serde(deserialize_with = "f64_from_str")]
397    pub pos_lat_apt: f64,
398    #[serde(deserialize_with = "f64_from_str")]
399    pub pos_long_apt: f64,
400    #[serde(deserialize_with = "f64_from_str")]
401    pub pos_lat_fix: f64,
402    #[serde(deserialize_with = "f64_from_str")]
403    pub pos_long_fix: f64,
404    #[serde(deserialize_with = "u16_from_str")]
405    pub elapsed_time: u16,
406    #[serde(deserialize_with = "u32_from_str")]
407    pub min_fob: u32,
408    #[serde(deserialize_with = "u32_from_str")]
409    pub est_fob: u32,
410}
411
412#[derive(Serialize, Deserialize, Debug, Clone)]
413pub struct Tlr {
414    pub takeoff: TlrContainer,
415    pub landing: TlrContainer,
416}
417
418#[derive(Serialize, Deserialize, Debug, Clone)]
419pub struct TlrContainer {
420    pub conditions: TlrConditions,
421    pub distance_dry: Option<TlrDistance>,
422    pub distance_wet: Option<TlrDistance>,
423    pub runway: Vec<TlrRunway>,
424}
425
426#[derive(Serialize, Deserialize, Debug, Clone)]
427pub struct TlrConditions {
428    pub airport_icao: String,
429    pub planned_runway: String,
430    #[serde(deserialize_with = "u32_from_str")]
431    pub planned_weight: u32,
432    #[serde(deserialize_with = "u16_from_str")]
433    pub wind_direction: u16,
434    #[serde(deserialize_with = "u8_from_str")]
435    pub wind_speed: u8,
436    #[serde(deserialize_with = "i8_from_str")]
437    pub temperature: i8,
438    #[serde(deserialize_with = "f64_from_str")]
439    pub altimeter: f64,
440    pub surface_condition: String,
441}
442
443#[derive(Serialize, Deserialize, Debug, Clone)]
444pub struct TlrRunway {
445    pub identifier: String,
446    #[serde(deserialize_with = "u16_from_str")]
447    pub length: u16,
448    #[serde(deserialize_with = "u16_from_str")]
449    pub length_tora: u16,
450    #[serde(deserialize_with = "u16_from_str")]
451    pub length_toda: u16,
452    #[serde(deserialize_with = "u16_from_str")]
453    pub length_asda: u16,
454    #[serde(deserialize_with = "u16_from_str")]
455    pub length_lda: u16,
456    #[serde(deserialize_with = "u16_from_str")]
457    pub elevation: u16,
458    #[serde(deserialize_with = "f64_from_str")]
459    pub gradient: f64,
460    #[serde(deserialize_with = "u16_from_str")]
461    pub true_course: u16,
462    #[serde(deserialize_with = "u16_from_str")]
463    pub magnetic_course: u16,
464    #[serde(deserialize_with = "i8_from_str")]
465    pub headwind_component: i8,
466    #[serde(deserialize_with = "i8_from_str")]
467    pub crosswind_component: i8,
468    #[serde(default, deserialize_with = "option_f64_from_str")]
469    pub ils_frequency: Option<f64>,
470    pub flap_setting: Option<String>,
471    pub thrust_setting: Option<String>,
472    pub bleed_setting: Option<String>,
473    pub anti_ice_setting: Option<String>,
474    #[serde(default, deserialize_with = "option_u8_from_str")]
475    pub flex_temperature: Option<u8>,
476    #[serde(default, deserialize_with = "option_u8_from_str")]
477    pub max_temperature: Option<u8>,
478    #[serde(default, deserialize_with = "option_u32_from_str")]
479    pub max_weight: Option<u32>,
480    pub limit_code: Option<String>,
481    pub limit_obstacle: Option<String>,
482    #[serde(default, deserialize_with = "option_u8_from_str")]
483    pub speeds_v1: Option<u8>,
484    #[serde(default, deserialize_with = "option_u8_from_str")]
485    pub speeds_vr: Option<u8>,
486    #[serde(default, deserialize_with = "option_u8_from_str")]
487    pub speeds_v2: Option<u8>,
488    #[serde(default, deserialize_with = "option_u8_from_str")]
489    pub speeds_other: Option<u8>,
490    pub speeds_other_id: Option<String>,
491    #[serde(default, deserialize_with = "option_u16_from_str")]
492    pub distance_decide: Option<u16>,
493    #[serde(default, deserialize_with = "option_u16_from_str")]
494    pub distance_reject: Option<u16>,
495    #[serde(default, deserialize_with = "option_u16_from_str")]
496    pub distance_margin: Option<u16>,
497    #[serde(default, deserialize_with = "option_u16_from_str")]
498    pub distance_continue: Option<u16>,
499    #[serde(default, deserialize_with = "option_u32_from_str")]
500    pub max_weight_dry: Option<u32>,
501    #[serde(default, deserialize_with = "option_u32_from_str")]
502    pub max_weight_wet: Option<u32>,
503}
504
505#[derive(Serialize, Deserialize, Debug, Clone)]
506pub struct TlrDistance {
507    #[serde(deserialize_with = "u32_from_str")]
508    pub weight: u32,
509    pub flap_setting: String,
510    pub brake_setting: String,
511    pub reverser_credit: String,
512    #[serde(default, deserialize_with = "option_u8_from_str")]
513    pub speeds_vref: Option<u8>,
514    #[serde(deserialize_with = "u16_from_str")]
515    pub actual_distance: u16,
516    #[serde(deserialize_with = "u16_from_str")]
517    pub factored_distance: u16,
518}
519
520#[derive(Serialize, Deserialize, Debug, Clone)]
521pub struct Atc {
522    pub flightplan_text: String,
523    pub route: String,
524    pub route_ifps: String,
525    pub callsign: String,
526    pub initial_spd: String,
527    pub initial_spd_unit: String,
528    pub initial_alt: String,
529    pub initial_alt_unit: String,
530    pub section18: String,
531    pub fir_orig: String,
532    pub fir_dest: String,
533    pub fir_altn: Option<Vec<String>>,
534    pub fir_etops: Option<Vec<String>>,
535    pub fir_enroute: Option<Vec<String>>,
536}
537
538#[derive(Serialize, Deserialize, Debug, Clone)]
539pub struct Aircraft {
540    pub icaocode: String,
541    pub iatacode: String,
542    pub base_type: String,
543    pub icao_code: String,
544    pub iata_code: String,
545    pub name: Option<String>,
546    pub reg: String,
547    pub fin: Option<String>,
548    pub selcal: Option<String>,
549    pub equip: Option<String>,
550    pub fuelfact: String,
551    pub fuelfactor: String,
552    #[serde(deserialize_with = "u16_from_str")]
553    pub max_passengers: u16,
554    pub supports_tlr: String,
555    pub internal_id: String,
556    #[serde(deserialize_with = "bool_from_str")]
557    pub is_custom: bool,
558}
559
560#[derive(Serialize, Deserialize, Debug, Clone)]
561pub struct Fuel {
562    #[serde(deserialize_with = "u32_from_str")]
563    pub taxi: u32,
564    #[serde(deserialize_with = "u32_from_str")]
565    pub enroute_burn: u32,
566    #[serde(deserialize_with = "u32_from_str")]
567    pub contingency: u32,
568    #[serde(deserialize_with = "u32_from_str")]
569    pub alternate_burn: u32,
570    #[serde(deserialize_with = "u32_from_str")]
571    pub reserve: u32,
572    #[serde(deserialize_with = "u32_from_str")]
573    pub etops: u32,
574    #[serde(deserialize_with = "u32_from_str")]
575    pub extra: u32,
576    #[serde(deserialize_with = "u32_from_str")]
577    pub extra_required: u32,
578    #[serde(deserialize_with = "u32_from_str")]
579    pub extra_optional: u32,
580    #[serde(deserialize_with = "u32_from_str")]
581    pub min_takeoff: u32,
582    #[serde(deserialize_with = "u32_from_str")]
583    pub plan_takeoff: u32,
584    #[serde(deserialize_with = "u32_from_str")]
585    pub plan_ramp: u32,
586    #[serde(deserialize_with = "u32_from_str")]
587    pub plan_landing: u32,
588    #[serde(deserialize_with = "u32_from_str")]
589    pub avg_fuel_flow: u32,
590    #[serde(deserialize_with = "u32_from_str")]
591    pub max_tanks: u32,
592}
593
594#[derive(Serialize, Deserialize, Debug, Clone)]
595pub struct FuelExtra {
596    pub bucket: Vec<FuelBucket>,
597}
598
599#[derive(Serialize, Deserialize, Debug, Clone)]
600pub struct FuelBucket {
601    pub label: String,
602    #[serde(deserialize_with = "u32_from_str")]
603    pub fuel: u32,
604    #[serde(deserialize_with = "u16_from_str")]
605    pub time: u16,
606    pub required: Option<String>,
607}
608
609#[derive(Serialize, Deserialize, Debug, Clone)]
610pub struct Times {
611    #[serde(deserialize_with = "u16_from_str")]
612    pub est_time_enroute: u16,
613    #[serde(deserialize_with = "u16_from_str")]
614    pub sched_time_enroute: u16,
615    #[serde(deserialize_with = "ts_from_string")]
616    pub sched_out: DateTime<Utc>,
617    #[serde(deserialize_with = "ts_from_string")]
618    pub sched_off: DateTime<Utc>,
619    #[serde(deserialize_with = "ts_from_string")]
620    pub sched_on: DateTime<Utc>,
621    #[serde(deserialize_with = "ts_from_string")]
622    pub sched_in: DateTime<Utc>,
623    #[serde(deserialize_with = "u16_from_str")]
624    pub sched_block: u16,
625    #[serde(deserialize_with = "ts_from_string")]
626    pub est_out: DateTime<Utc>,
627    #[serde(deserialize_with = "ts_from_string")]
628    pub est_off: DateTime<Utc>,
629    #[serde(deserialize_with = "ts_from_string")]
630    pub est_on: DateTime<Utc>,
631    #[serde(deserialize_with = "ts_from_string")]
632    pub est_in: DateTime<Utc>,
633    #[serde(deserialize_with = "u16_from_str")]
634    pub est_block: u16,
635    #[serde(deserialize_with = "i8_from_str")]
636    pub orig_timezone: i8,
637    #[serde(deserialize_with = "i8_from_str")]
638    pub dest_timezone: i8,
639    #[serde(deserialize_with = "u16_from_str")]
640    pub taxi_out: u16,
641    #[serde(deserialize_with = "u16_from_str")]
642    pub taxi_in: u16,
643    #[serde(deserialize_with = "u16_from_str")]
644    pub reserve_time: u16,
645    #[serde(deserialize_with = "u16_from_str")]
646    pub endurance: u16,
647    #[serde(deserialize_with = "u16_from_str")]
648    pub contfuel_time: u16,
649    #[serde(deserialize_with = "u16_from_str")]
650    pub etopsfuel_time: u16,
651    #[serde(deserialize_with = "u16_from_str")]
652    pub extrafuel_time: u16,
653}
654
655#[derive(Serialize, Deserialize, Debug, Clone)]
656pub struct Weights {
657    #[serde(deserialize_with = "u32_from_str")]
658    pub oew: u32,
659    #[serde(deserialize_with = "u16_from_str")]
660    pub pax_count: u16,
661    #[serde(deserialize_with = "u16_from_str")]
662    pub bag_count: u16,
663    #[serde(deserialize_with = "u16_from_str")]
664    pub pax_count_actual: u16,
665    #[serde(deserialize_with = "u16_from_str")]
666    pub bag_count_actual: u16,
667    #[serde(deserialize_with = "f64_from_str")]
668    pub pax_weight: f64,
669    #[serde(deserialize_with = "f64_from_str")]
670    pub bag_weight: f64,
671    #[serde(deserialize_with = "f64_from_str")]
672    pub freight_added: f64,
673    #[serde(deserialize_with = "u32_from_str")]
674    pub cargo: u32,
675    #[serde(deserialize_with = "u32_from_str")]
676    pub payload: u32,
677    #[serde(deserialize_with = "u32_from_str")]
678    pub est_zfw: u32,
679    #[serde(deserialize_with = "u32_from_str")]
680    pub max_zfw: u32,
681    #[serde(deserialize_with = "u32_from_str")]
682    pub est_tow: u32,
683    #[serde(deserialize_with = "u32_from_str")]
684    pub max_tow: u32,
685    #[serde(deserialize_with = "u32_from_str")]
686    pub max_tow_struct: u32,
687    pub tow_limit_code: String,
688    #[serde(deserialize_with = "u32_from_str")]
689    pub est_ldw: u32,
690    #[serde(deserialize_with = "u32_from_str")]
691    pub max_ldw: u32,
692    #[serde(deserialize_with = "u32_from_str")]
693    pub est_ramp: u32,
694}
695
696#[derive(Serialize, Deserialize, Debug, Clone)]
697pub struct Impacts {
698    pub minus_6000ft: Option<Impact>,
699    pub minus_4000ft: Option<Impact>,
700    pub minus_2000ft: Option<Impact>,
701    pub plus_2000ft: Option<Impact>,
702    pub plus_4000ft: Option<Impact>,
703    pub plus_6000ft: Option<Impact>,
704    pub higher_ci: Option<Impact>,
705    pub lower_ci: Option<Impact>,
706    pub zfw_plus_1000: Option<Impact>,
707    pub zfw_minus_1000: Option<Impact>,
708}
709
710#[derive(Serialize, Deserialize, Debug, Clone)]
711pub struct Impact {
712    #[serde(deserialize_with = "u32_from_str")]
713    pub time_enroute: u32,
714    #[serde(deserialize_with = "i32_from_str")]
715    pub time_difference: i32,
716    #[serde(deserialize_with = "u32_from_str")]
717    pub enroute_burn: u32,
718    #[serde(deserialize_with = "i32_from_str")]
719    pub burn_difference: i32,
720    #[serde(deserialize_with = "u32_from_str")]
721    pub ramp_fuel: u32,
722    #[serde(deserialize_with = "u16_from_str")]
723    pub initial_fl: u16,
724    #[serde(deserialize_with = "u16_from_str")]
725    pub initial_tas: u16,
726    pub initial_mach: String,
727    #[serde(deserialize_with = "u16_from_str")]
728    pub cost_index: u16,
729}
730
731#[derive(Serialize, Deserialize, Debug, Clone)]
732pub struct Crew {
733    #[serde(deserialize_with = "u32_from_str")]
734    pub pilot_id: u32,
735    pub cpt: String,
736    pub fo: String,
737    pub dx: String,
738    pub pu: String,
739    pub fa: Vec<String>,
740}
741
742#[derive(Serialize, Deserialize, Debug, Clone)]
743pub struct Notams {
744    #[serde(alias = "rec-count")]
745    pub rec_count: String,
746    pub notamdrec: Vec<NotamDrec>,
747}
748
749#[derive(Serialize, Deserialize, Debug, Clone)]
750pub struct NotamDrec {
751    pub source_id: String,
752    pub account_id: String,
753    #[serde(alias = "notam_id")]
754    pub id: String,
755    #[serde(alias = "notam_part")]
756    pub part: String,
757    pub cns_location_id: String,
758    pub icao_id: String,
759    pub icao_name: Option<String>,
760    pub total_parts: String,
761    #[serde(alias = "notam_created_dtg")]
762    pub created_dtg: String,
763    #[serde(alias = "notam_effective_dtg")]
764    pub effective_dtg: String,
765    #[serde(alias = "notam_expire_dtg")]
766    pub expire_dtg: Option<String>,
767    #[serde(alias = "notam_expire_dtg_estimated")]
768    pub expire_dtg_estimated: Option<String>,
769    #[serde(alias = "notam_lastmod_dtg")]
770    pub lastmod_dtg: String,
771    #[serde(alias = "notam_inserted_dtg")]
772    pub inserted_dtg: String,
773    #[serde(alias = "notam_text")]
774    pub text: String,
775    #[serde(alias = "notam_report")]
776    pub report: String,
777    #[serde(alias = "notam_nrc")]
778    pub nrc: Option<String>,
779    #[serde(alias = "notam_qcode")]
780    pub qcode: Option<String>,
781}
782
783#[derive(Serialize, Deserialize, Debug, Clone)]
784pub struct Weather {
785    pub orig_metar: String,
786    pub orig_taf: String,
787    pub dest_metar: String,
788    pub dest_taf: String,
789    pub altn_metar: Option<Vec<String>>,
790    pub altn_taf: Option<Vec<String>>,
791    pub toaltn_metar: Option<String>,
792    pub toaltn_taf: Option<String>,
793    pub eualtn_metar: Option<String>,
794    pub eualtn_taf: Option<String>,
795    pub etops_metar: Option<Vec<String>>,
796    pub etops_taf: Option<Vec<String>>,
797}
798
799#[derive(Serialize, Deserialize, Debug, Clone)]
800pub struct Sigmets {
801    pub sigmet: Vec<Sigmet>,
802}
803
804#[derive(Serialize, Deserialize, Debug, Clone)]
805pub struct Sigmet {
806    #[serde(alias = "type")]
807    pub variant: String,
808    pub loc: String,
809    pub address: String,
810    pub title: String,
811    pub fir: String,
812    pub fir_name: String,
813    pub id: String,
814    pub hazard: String,
815    pub qualifier: Option<String>,
816    #[serde(deserialize_with = "ts_from_string")]
817    pub issued: DateTime<Utc>,
818    #[serde(deserialize_with = "ts_from_string")]
819    pub start: DateTime<Utc>,
820    #[serde(deserialize_with = "ts_from_string")]
821    pub end: DateTime<Utc>,
822    pub text: String,
823}
824
825#[derive(Serialize, Deserialize, Debug, Clone)]
826pub struct GenericOfp {
827    pub user_id: u32,
828    pub time: u32,
829    pub airac: String,
830    pub airline_icao: String,
831    pub flight_number: String,
832    pub callsign: String,
833    pub costindex: u16,
834    pub initial_altitude: u16,
835    pub stepclimb: String,
836    pub route_distance: u16,
837    pub total_burn: u32,
838    pub route: String,
839    pub origin_icao: String,
840    pub origin_name: String,
841    pub origin_plan_rwy: String,
842    pub origin_procedure: String,
843    pub destination_icao: String,
844    pub destination_name: String,
845    pub destination_plan_rwy: String,
846    pub destination_procedure: String,
847    pub alternates: Vec<String>,
848}