package Ġf tl . doctor Ċ Ċ import Ġcom . fasterxml . jackson . databind . JsonNode Ċ import Ġcom . google . common . annotations . Visible ForTesting Ċ import Ġfl ank . common . normalize Line Ending Ċ import Ġf tl . args . Android Args Companion Ċ import Ġf tl . args . Args Helper Ċ import Ġf tl . args . I Args Ċ import Ġf tl . args . yml . MODEL _ NODE Ċ import Ġf tl . args . yml . VERSION _ NODE Ċ import Ġf tl . args . yml . devices Node Ċ import Ġf tl . args . yml . not Valid Devices Ċ import Ġf tl . config . load Android Config Ċ import Ġf tl . config . load I os Config Ċ import Ġf tl . domain . Run Doctor Ċ import Ġf tl . run . exception . Fl ank Configuration Error Ċ import Ġf tl . util . load File Ċ import Ġjava . io . Reader Ċ import Ġjava . nio . file . Path Ċ Ċ fun Ġvalidate Yaml ( args : ĠI Args . I Companion , Ġpath : ĠPath ): ĠRun Doctor . Error Ġ= ĊĠĠĠ Ġif Ġ(! path . to File (). exists ()) ĠRun Doctor . Error ( parsing Errors Ġ= ĠlistOf (" Skipping Ġyaml Ġvalidation . ĠNo Ġfile Ġat Ġpath Ġ$ path ")) ĊĠĠĠ Ġelse Ġvalidate Yaml ( args , Ġload File ( path )) Ġ+ Ġpreload Configuration ( path , Ġargs Ġis ĠAndroid Args Companion ) Ċ Ċ @ Visible ForTesting Ċ internal Ġfun Ġvalidate Yaml ( args : ĠI Args . I Companion , Ġdata : ĠReader ): ĠRun Doctor . Error Ġ= ĊĠĠĠ Ġrun Catch ing Ġ{ ĠArgs Helper . yaml Mapper . read Tree ( data ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRun Doctor . Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparsing Errors Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . message ?. replace ( System . line Separator (), Ġ"\ n ") Ġ?: Ġ" Unknown Ġerror Ġwhen Ġparsing Ġtree " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. get OrNull () ĊĠĠĠĠĠĠĠ Ġ? . run Ġ{ Ġvalidate Yaml Keys ( args ) Ġ} ĊĠĠĠĠĠĠĠ Ġ?: ĠRun Doctor . Error . EMPTY Ċ Ċ private Ġfun ĠJsonNode . validate Yaml Keys ( args : ĠI Args . I Companion ) Ġ= ĠRun Doctor . Error ( ĊĠĠĠ Ġtop Level Unknown Keys Ġ= Ġvalidate TopLevel Keys ( args ), ĊĠĠĠ Ġnested Unknown Keys Ġ= Ġargs . valid Args . map Ġ{ Ġ( top Level Key , Ġvalid Args Keys ) Ġ-> ĊĠĠĠĠĠĠĠ Ġ( top Level Key Ġto Ġvalidate Nested Keys ( top Level Key , Ġvalid Args Keys )) ĊĠĠĠ Ġ}. filter Ġ{ Ġit . second . isNotEmpty () Ġ}. toMap (), ĊĠĠĠ Ġinvalid Devices Ġ= Ġvalidate Devices (). or Empty () Ċ ) Ċ Ċ private Ġfun ĠJsonNode . validate TopLevel Keys ( args : ĠI Args . I Companion ): ĠList < String > Ġ= ĊĠĠĠ Ġ( parse Args (). keys Ġ- Ġargs . valid Args . keys ) ĊĠĠĠĠĠĠĠ Ġ. take If Ġ{ Ġit . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠ Ġ? . toList () ĊĠĠĠĠĠĠĠ Ġ. or Empty () Ċ Ċ private Ġfun ĠJsonNode . parse Args () Ġ= Ġmutable Map Of < String , ĠList < String >> (). apply Ġ{ ĊĠĠĠ Ġfor Ġ( child Ġin Ġfields ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis [ child . key ] Ġ= Ġchild . value . fields (). as Sequence (). map Ġ{ Ġit . key Ġ}. toList () ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠJsonNode . validate Nested Keys ( top Level Key : ĠString , Ġvalid Args Keys : ĠList < String >) Ġ= ĊĠĠĠ Ġnested Keys For ( top Level Key ) Ġ- Ġvalid Args Keys Ċ Ċ private Ġfun ĠJsonNode . nested Keys For ( top Level Key : ĠString ) Ġ= ĊĠĠĠ Ġthis [ top Level Key ]?. fields ()?. as Sequence ()?. map Ġ{ Ġit . key Ġ} ?. toList (). or Empty () Ċ Ċ private Ġfun Ġpreload Configuration ( data : ĠPath , Ġis Android : ĠBoolean ) Ġ= ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Android ) Ġload Android Config ( data ) Ġelse Ġload I os Config ( data ) ĊĠĠĠĠĠĠĠ ĠRun Doctor . Error . EMPTY ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠFl ank Configuration Error ) Ġ{ ĊĠĠĠĠĠĠĠ ĠRun Doctor . Error ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparsing Errors Ġ= ĠlistOf ( e . message . or Empty ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ Ċ private Ġfun ĠJsonNode . validate Devices () Ġ= ĊĠĠĠ Ġdevices Node ?. not Valid Devices ?. with Version Node ?. map Ġ{ Ġdevice Ġ-> ĊĠĠĠĠĠĠĠ ĠRun Doctor . Error . Invalid Device ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice [ VERSION _ NODE ]. as Text (" Unknown "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice [ MODEL _ NODE ]. as Text (" Unknown ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ Ċ private Ġval ĠList < JsonNode >. with Version Node ĊĠĠĠ Ġget () Ġ= Ġthis . filter Ġ{ Ġit . has ( VERSION _ NODE ) Ġ} Ċ Ċ private Ġoperator Ġfun ĠRun Doctor . Error . plus ( right : ĠRun Doctor . Error ) Ġ= ĠRun Doctor . Error ( ĊĠĠĠ Ġparsing Errors Ġ= Ġparsing Errors . plus ( right . parsing Errors ). distinct By Ġ{ Ġit . normalize Line Ending () Ġ}, ĊĠĠĠ Ġtop Level Unknown Keys Ġ= Ġtop Level Unknown Keys Ġ+ Ġright . top Level Unknown Keys , ĊĠĠĠ Ġnested Unknown Keys Ġ= Ġnested Unknown Keys Ġ+ Ġright . nested Unknown Keys , ĊĠĠĠ Ġinvalid Devices Ġ= Ġinvalid Devices Ġ+ Ġright . invalid Devices Ċ ) Ċ