package Ġch . der lin . dc viz mer maid . data Ċ Ċ import Ġch . der lin . dc viz mer maid . helpers . YAML Ċ import Ġch . der lin . dc viz mer maid . helpers . Yaml Utils . getBy Path Ċ Ċ data Ġclass ĠPort Binding ( val Ġservice : ĠString , Ġval Ġinternal Port : ĠInt , Ġval Ġexternal Port : ĠInt Ġ= Ġinternal Port ) Ġ{ ĊĊĠĠĠ Ġval Ġinternal If Different Ġ= Ġif Ġ( internal Port Ġ== Ġexternal Port ) Ġnull Ġelse Ġinternal Port ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġparse ( service : ĠString , Ġdeclaration : ĠAny ): ĠPort Binding ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInt Ġ-> Ġparse String ( service , Ġdeclaration . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Ġ-> Ġparse String ( service , Ġdeclaration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMap < *, Ġ*> Ġ-> Ġparse Yaml ( service , Ġdeclaration Ġas ĠYAML ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġparse String ( service : ĠString , Ġdeclaration : ĠString ): ĠPort Binding ? Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplit Ġ= Ġdeclaration . substring Before ("/ "). split (": "). reversed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinternal Ġ= Ġsplit [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexternal Ġ= Ġsplit . get OrNull ( 1 )?. if Blank Ġ{ Ġnull Ġ} Ġ?: Ġinternal ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPort Binding ( service , Ġinternal . toInt (), Ġexternal . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġparse Yaml ( service : ĠString , Ġdeclaration : ĠYAML ): ĠPort Binding ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( declaration . containsKey (" published ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . getBy Path (" published ", ĠInt :: class )?. let Ġ{ Ġexternal Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPort Binding ( service , Ġinternal Port Ġ= Ġdeclaration . getBy Path (" target ", ĠInt :: class ) Ġ?: Ġ 0 , Ġexternal Port Ġ= Ġexternal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠ Ġ} Ċ } Ċ