use anyhow::{anyhow, Result}; pub use google_walletobjects1::api::*; use crate::resolution792::BoardingPass; use crate::static_data::AIRLINE_DATA; pub fn passes_from_barcode( issuer_id: &str, boarding_pass: BoardingPass, ) -> Result<(Vec, Vec)> { if boarding_pass.legs.len() > 1 { return Err(anyhow!("multi-leg trips aren't supported yet")); } let leg = &boarding_pass.legs[0]; let airline_data = AIRLINE_DATA.get(&leg.operating_carrier).ok_or_else(|| { anyhow!( "no AIRLINE_DATA has been provided for {} yet", leg.operating_carrier ) })?; let frequent_flyer_program_data = if leg.frequent_flyer_airline.is_none() { None } else { AIRLINE_DATA.get(&leg.frequent_flyer_airline.as_ref().unwrap()) }; let id_prefix = format!( "{}.{}{}-{}-{}{}", issuer_id, leg.operating_carrier, leg.flight_number, leg.date_of_flight, leg.origin_airport, leg.destination_airport ); let class_id = &id_prefix; let pass_id = format!("{}-{}", &id_prefix, leg.check_in_sequence); let class = FlightClass { id: Some(class_id.clone()), issuer_name: Some(airline_data.name.to_string()), hex_background_color: Some(airline_data.boarding_pass_background_colour.to_string()), review_status: Some("UNDER_REVIEW".to_string()), boarding_and_seating_policy: Some(BoardingAndSeatingPolicy { boarding_policy: Some(airline_data.boarding_policy.to_string()), seat_class_policy: Some(airline_data.seat_class_policy.to_string()), ..Default::default() }), origin: Some(AirportInfo { airport_iata_code: Some(leg.origin_airport.clone()), ..Default::default() }), destination: Some(AirportInfo { airport_iata_code: Some(leg.destination_airport.clone()), ..Default::default() }), flight_header: Some(FlightHeader { carrier: Some(FlightCarrier { airline_alliance_logo: airline_data.alliance_logo_url.map(url_to_image), airline_logo: Some(url_to_image(airline_data.logo_url)), airline_name: Some(localized_string("en-GB", airline_data.name)), carrier_iata_code: Some(leg.operating_carrier.to_string()), ..Default::default() }), flight_number: Some(leg.flight_number.to_string()), ..Default::default() }), ..Default::default() }; let pass_barcode = String::from_utf8(boarding_pass.initial_data)?; let eticket_number = if leg.airline_numeric_code.is_some() && leg.document_serial_number.is_some() { Some(format!( "{}-{}", leg.airline_numeric_code.as_ref().unwrap(), leg.document_serial_number.as_ref().unwrap() )) } else { Some("125-2150000000".to_string()) }; let pass = FlightObject { id: Some(pass_id), class_id: Some(class_id.clone()), state: Some("ACTIVE".to_string()), passenger_name: Some(boarding_pass.passenger_name.clone()), reservation_info: Some(ReservationInfo { confirmation_code: Some(leg.operating_carrier_pnr.clone()), eticket_number, frequent_flyer_info: if frequent_flyer_program_data.is_none() { None } else { Some(FrequentFlyerInfo { frequent_flyer_program_name: frequent_flyer_program_data .unwrap().frequent_flyer_program_name .map(|n| localized_string("en-GB", n)), frequent_flyer_number: leg.frequent_flyer_number.clone(), ..Default::default() }) }, ..Default::default() }), boarding_and_seating_info: Some(BoardingAndSeatingInfo { boarding_group: Some("GROUP1".to_string()), seat_class: Some("Club World".to_string()), seat_number: Some(leg.seat_number.clone()), sequence_number: Some(leg.check_in_sequence.clone()), boarding_privilege_image: airline_data .boarding_privilege_logo_url .clone() .map(|u| url_to_image(u)), ..Default::default() }), barcode: Some(Barcode { type_: Some("aztec".to_string()), value: Some(pass_barcode), ..Default::default() }), hex_background_color: Some("#b38f47".to_string()), ..Default::default() }; Ok((vec![class], vec![pass])) } pub fn localized_string(locale: &str, s: &str) -> LocalizedString { LocalizedString { default_value: Some(TranslatedString { language: Some(locale.to_string()), value: Some(s.to_string()), ..Default::default() }), ..Default::default() } } pub fn url_to_image(url: &str) -> Image { Image { source_uri: Some(ImageUri { uri: Some(url.to_string()), ..Default::default() }), ..Default::default() } }