1use 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}