@@ -319,7 +319,8 @@ pub async fn gateway_check_updates(
319319 let xplane_root = validate_xplane_root ( & xplane_path) ?;
320320 let xplane_key = normalize_xplane_key ( & xplane_root) ;
321321 let release_info = fetch_release_info ( release_version. as_deref ( ) ) . await ;
322- let release_scenery = std:: sync:: Arc :: new ( fetch_release_scenery_set ( release_version. as_deref ( ) ) . await ) ;
322+ let release_scenery =
323+ std:: sync:: Arc :: new ( fetch_release_scenery_set ( release_version. as_deref ( ) ) . await ) ;
323324 let installed = list_installed_internal ( & db. get ( ) , & xplane_root, & xplane_key) . await ?;
324325 if installed. is_empty ( ) {
325326 return Ok ( installed) ;
@@ -330,49 +331,52 @@ pub async fn gateway_check_updates(
330331 let release_info = release_info. clone ( ) ;
331332 let release_scenery = release_scenery. clone ( ) ;
332333 async move {
333- match fetch_gateway_airport_payload ( & installed. airport_icao ) . await {
334- Ok ( payload) => {
335- let summary = parse_gateway_airport_summary ( & payload, & installed. airport_icao ) ;
336- let detail = parse_gateway_airport_detail ( & payload, & installed. airport_icao ) ;
337- let mut next = installed. clone ( ) ;
338- if let Some ( summary) = summary {
339- next. latest_scenery_id = summary. recommended_scenery_id ;
340- next. latest_artist = summary. recommended_artist ;
341- next. latest_approved_date = summary. recommended_accepted_at ;
342- next. update_available = summary
343- . recommended_scenery_id
344- . map ( |latest| latest != next. scenery_id ) ;
345- if let Some ( detail) = detail {
346- let comparison = compute_release_comparison (
347- & detail,
348- release_scenery. as_ref ( ) . as_ref ( ) ,
349- ) ;
350- apply_release_comparison_to_installed (
351- & mut next,
352- release_info. as_ref ( ) ,
353- comparison. as_ref ( ) ,
354- ) ;
334+ match fetch_gateway_airport_payload ( & installed. airport_icao ) . await {
335+ Ok ( payload) => {
336+ let summary =
337+ parse_gateway_airport_summary ( & payload, & installed. airport_icao ) ;
338+ let detail =
339+ parse_gateway_airport_detail ( & payload, & installed. airport_icao ) ;
340+ let mut next = installed. clone ( ) ;
341+ if let Some ( summary) = summary {
342+ next. latest_scenery_id = summary. recommended_scenery_id ;
343+ next. latest_artist = summary. recommended_artist ;
344+ next. latest_approved_date = summary. recommended_accepted_at ;
345+ next. update_available = summary
346+ . recommended_scenery_id
347+ . map ( |latest| latest != next. scenery_id ) ;
348+ if let Some ( detail) = detail {
349+ let comparison = compute_release_comparison (
350+ & detail,
351+ release_scenery. as_ref ( ) . as_ref ( ) ,
352+ ) ;
353+ apply_release_comparison_to_installed (
354+ & mut next,
355+ release_info. as_ref ( ) ,
356+ comparison. as_ref ( ) ,
357+ ) ;
358+ }
359+ ( next, true )
360+ } else {
361+ next. update_available = None ;
362+ ( next, false )
355363 }
356- ( next, true )
357- } else {
364+ }
365+ Err ( error) => {
366+ logger:: log_error (
367+ & format ! (
368+ "Failed to check Gateway updates for {}: {}" ,
369+ installed. airport_icao, error
370+ ) ,
371+ Some ( "gateway" ) ,
372+ ) ;
373+ let mut next = installed. clone ( ) ;
358374 next. update_available = None ;
359375 ( next, false )
360376 }
361377 }
362- Err ( error) => {
363- logger:: log_error (
364- & format ! (
365- "Failed to check Gateway updates for {}: {}" ,
366- installed. airport_icao, error
367- ) ,
368- Some ( "gateway" ) ,
369- ) ;
370- let mut next = installed. clone ( ) ;
371- next. update_available = None ;
372- ( next, false )
373- }
374378 }
375- } } )
379+ } )
376380 . buffer_unordered ( UPDATE_CHECK_CONCURRENCY )
377381 . collect ( )
378382 . await ;
@@ -392,7 +396,9 @@ pub async fn gateway_check_updates(
392396}
393397
394398#[ tauri:: command]
395- pub async fn gateway_resolve_release_context ( xplane_path : String ) -> ApiResult < GatewayReleaseContext > {
399+ pub async fn gateway_resolve_release_context (
400+ xplane_path : String ,
401+ ) -> ApiResult < GatewayReleaseContext > {
396402 let xplane_root = validate_xplane_root ( & xplane_path) ?;
397403 resolve_release_context ( & xplane_root) . await
398404}
@@ -444,7 +450,11 @@ async fn resolve_release_context(xplane_root: &Path) -> ApiResult<GatewayRelease
444450}
445451
446452async fn fetch_release_directory ( ) -> Option < Vec < GatewayReleaseInfo > > {
447- if let Some ( cached) = RELEASE_DIRECTORY_CACHE . read ( ) . ok ( ) . and_then ( |cache| cache. clone ( ) ) {
453+ if let Some ( cached) = RELEASE_DIRECTORY_CACHE
454+ . read ( )
455+ . ok ( )
456+ . and_then ( |cache| cache. clone ( ) )
457+ {
448458 if cached
449459 . fetched_at
450460 . elapsed ( )
@@ -468,7 +478,10 @@ async fn fetch_release_directory() -> Option<Vec<GatewayReleaseInfo>> {
468478
469479 let releases = parse_gateway_release_directory ( & payload) ;
470480 if releases. is_empty ( ) {
471- logger:: log_error ( "Gateway release directory returned no usable versions" , Some ( "gateway" ) ) ;
481+ logger:: log_error (
482+ "Gateway release directory returned no usable versions" ,
483+ Some ( "gateway" ) ,
484+ ) ;
472485 return None ;
473486 }
474487
@@ -485,7 +498,9 @@ async fn fetch_release_directory() -> Option<Vec<GatewayReleaseInfo>> {
485498async fn fetch_release_info ( version : Option < & str > ) -> Option < GatewayReleaseInfo > {
486499 let version = version. map ( str:: trim) . filter ( |value| !value. is_empty ( ) ) ?;
487500 let releases = fetch_release_directory ( ) . await ?;
488- releases. into_iter ( ) . find ( |release| release. version == version)
501+ releases
502+ . into_iter ( )
503+ . find ( |release| release. version == version)
489504}
490505
491506async fn fetch_release_scenery_set ( version : Option < & str > ) -> Option < HashSet < i64 > > {
@@ -506,20 +521,20 @@ async fn fetch_release_scenery_set(version: Option<&str>) -> Option<HashSet<i64>
506521 }
507522 }
508523
509- let payload = match fetch_gateway_json ( & format ! ( "{}/release/{}" , GATEWAY_API_BASE , version ) ) . await
510- {
511- Ok ( payload) => payload,
512- Err ( error) => {
513- logger:: log_error (
514- & format ! (
515- "Failed to fetch Gateway release scenery packs for {}: {}" ,
516- version, error
517- ) ,
518- Some ( "gateway" ) ,
519- ) ;
520- return None ;
521- }
522- } ;
524+ let payload =
525+ match fetch_gateway_json ( & format ! ( "{}/release/{}" , GATEWAY_API_BASE , version ) ) . await {
526+ Ok ( payload) => payload,
527+ Err ( error) => {
528+ logger:: log_error (
529+ & format ! (
530+ "Failed to fetch Gateway release scenery packs for {}: {}" ,
531+ version, error
532+ ) ,
533+ Some ( "gateway" ) ,
534+ ) ;
535+ return None ;
536+ }
537+ } ;
523538
524539 let scenery_packs = parse_release_scenery_set ( & payload) ;
525540 if scenery_packs. is_empty ( ) {
@@ -554,7 +569,9 @@ fn parse_gateway_release_directory(payload: &Value) -> Vec<GatewayReleaseInfo> {
554569 . iter ( )
555570 . filter_map ( |entry| {
556571 let record = entry. as_object ( ) ?;
557- let version = pick_string ( record, & [ "Version" , "version" ] ) ?. trim ( ) . to_string ( ) ;
572+ let version = pick_string ( record, & [ "Version" , "version" ] ) ?
573+ . trim ( )
574+ . to_string ( ) ;
558575 let date = pick_string ( record, & [ "Date" , "date" ] ) ?. trim ( ) . to_string ( ) ;
559576 let parsed_version = parse_xplane_version_for_compare ( & version) ?;
560577 Some ( GatewayReleaseInfo {
@@ -602,7 +619,9 @@ fn parse_xplane_version_for_compare(raw: &str) -> Option<Version> {
602619}
603620
604621fn normalize_xplane_version_token ( raw : & str ) -> Option < String > {
605- let trimmed = raw. trim ( ) . trim_start_matches ( |ch : char | ch == 'v' || ch == 'V' ) ;
622+ let trimmed = raw
623+ . trim ( )
624+ . trim_start_matches ( |ch : char | ch == 'v' || ch == 'V' ) ;
606625 if trimmed. is_empty ( ) {
607626 return None ;
608627 }
@@ -783,12 +802,18 @@ fn read_windows_file_version(path: &Path) -> Option<String> {
783802 ( 0x0409 , 0x04b0 )
784803 } ;
785804
786- let product_key = format ! ( "\\ StringFileInfo\\ {:04x}{:04x}\\ ProductVersion" , lang, codepage) ;
805+ let product_key = format ! (
806+ "\\ StringFileInfo\\ {:04x}{:04x}\\ ProductVersion" ,
807+ lang, codepage
808+ ) ;
787809 if let Some ( version) = query_windows_version_string ( & mut data, & product_key) {
788810 return Some ( version) ;
789811 }
790812
791- let file_key = format ! ( "\\ StringFileInfo\\ {:04x}{:04x}\\ FileVersion" , lang, codepage) ;
813+ let file_key = format ! (
814+ "\\ StringFileInfo\\ {:04x}{:04x}\\ FileVersion" ,
815+ lang, codepage
816+ ) ;
792817 if let Some ( version) = query_windows_version_string ( & mut data, & file_key) {
793818 return Some ( version) ;
794819 }
@@ -825,7 +850,9 @@ unsafe fn query_windows_version_string(data: &mut [u8], key: &str) -> Option<Str
825850 . iter ( )
826851 . position ( |value| * value == 0 )
827852 . unwrap_or ( value_slice. len ( ) ) ;
828- let value = String :: from_utf16_lossy ( & value_slice[ ..end] ) . trim ( ) . to_string ( ) ;
853+ let value = String :: from_utf16_lossy ( & value_slice[ ..end] )
854+ . trim ( )
855+ . to_string ( ) ;
829856 ( !value. is_empty ( ) ) . then_some ( value)
830857}
831858
0 commit comments