package Ġcom . bot t ler ocket stud ios . br architecture . data . model Ċ Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . Inter rupted IOException Ċ import Ġjava . net . Socket Exception Ċ Ċ /** Ċ Ġ* ĠWrapper Ġclass Ġfor Ġ[ Success ] Ġtype Ġthat Ġalso Ġrepresent Ġvarious Ġ[ Failure ] s Ġwith Ġappropriate Ġassociated Ġdata . Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġa Ġloading Ġtype Ġat Ġthis Ġlevel Ġis Ġunnecessary . ĠLoading Ġstatus Ġcan Ġbe Ġhandled Ġat Ġa Ġhigher Ġlevel Ġif Ġneeded Ġbut Ġhasn 't Ġbeen Ġvery Ġuseful Ġfrom Ġpast Ġexperience . Ċ Ġ*/ Ċ sealed Ġclass ĠApi Result < out ĠSUCCESS _ TYPE Ġ: ĠAny > Ġ{ ĊĊĠĠĠ Ġ/** ĠIndicates Ġa Ġsuccessful Ġoperation Ġ( ex : Ġsuccessful Ġapi Ġresponse ) Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠSuccess < out ĠSUCCESS _ TYPE Ġ: ĠAny >( val Ġdata : ĠSUCCESS _ TYPE ) Ġ: ĠApi Result < SUCCESS _ TYPE >() ĊĊĠĠĠ Ġ/** ĠIndicates Ġa Ġfailed Ġoperation Ġ( ex : Ġapi Ġresponse Ġerror , Ġparsing Ġerror , Ġexception Ġthrown , Ġetc ) Ġ*/ ĊĠĠĠ Ġsealed Ġclass ĠFailure Ġ: ĠApi Result < Nothing >() Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĠNetwork Ġfailures Ġdue Ġto Ġnetwork Ġtimeout Ġconnection Ġissues Ġ( no Ġconnection , Ġair plane Ġmode , Ġwifi Ġconnected Ġwith Ġno Ġinternet ) Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠNetwork Timeout Failure ( val Ġexception : ĠException ) Ġ: ĠFailure () ĊĊĠĠĠĠĠĠĠ Ġ/** ĠRet rofit + M oshi Ġparse Ġfailures Ġor Ġother Ġerrors Ġrelated Ġto Ġthe Ġapi Ġcalls Ġ*/ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠServer ( val Ġerror : ĠServer Error ?) Ġ: ĠFailure () ĊĊĠĠĠĠĠĠĠ Ġ/** ĠGeneral Ġfailure Ġtype Ġbucket Ġ*/ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠGeneral Failure ( val Ġmessage : ĠString ) Ġ: ĠFailure () ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠExec utes Ġthe Ġ[ transform ] Ġblock Ġonly Ġwhen Ġreceiver Ġ[ Api Result . Success ] Ġto Ġmodify Ġthe Ġwrapped Ġvalue , Ġsimilar Ġto ĠCollection / List Ġmap Ġfunction . Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġyou Ġneed Ġto Ġwrap Ġthe Ġvalue Ġyou Ġreturn Ġback Ġfrom Ġthe Ġ[ transform ] Ġblock Ġ( at Ġthe Ġcall Ġsite ) Ġinto Ġan Ġ[ Api Result ]. Ċ Ġ* ĠThis Ġgives Ġyou Ġthe Ġability Ġto Ġchange Ġthe Ġtype Ġfrom Ġ[ Api Result . Success ] Ġto Ġ[ Api Result . Failure ] Ġbased Ġon Ġbusiness Ġlogic / etc Ċ Ġ* ĠEx : ĠMapping Ġa ĠD to Ġto ĠDomain Model Ġwhere Ġthe Ġmapping Ġcannot Ġbe Ġperformed Ġdue Ġto Ġinvalid Ġdata , Ġetc Ġshould Ġlikely Ġreturn Ġa Ġ[ Api Result . Failure ] Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġfailure Ġhas Ġnot Ġbeen Ġthorough ly Ġtested Ġyet Ġbut Ġ_ should _ Ġwork . Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠAny , ĠR Ġ: ĠAny > ĠApi Result < T >. map ( transform : Ġ( T ) Ġ-> ĠApi Result < R >): ĠApi Result < R > Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠApi Result . Success Ġ-> Ġtransform ( data ) ĊĠĠĠĠĠĠĠ Ġis ĠApi Result . Failure Ġ-> Ġthis ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** ĠConverts ĠApi Result < T > Ġinto ĠApi Result < Unit > Ġto Ġbe Ġused Ġwhen Ġthe Ġsuccess Ġreturn Ġtype Ġdoesn 't Ġmatter Ġ*/ Ċ fun Ġ< T Ġ: ĠAny > ĠApi Result < T >. as Empty Result (): ĠApi Result < Unit > Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠApi Result . Success Ġ-> ĠApi Result . Success ( Unit ) ĊĠĠĠĠĠĠĠ Ġis ĠApi Result . Failure Ġ-> Ġthis ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** ĠSyntax Ġs ugar Ġto Ġexecute Ġ[ on Success Block ] Ġwhen Ġthis Ġis ĠApi Result . Success Ġ*/ Ċ inline Ġfun Ġ< T Ġ: ĠAny > ĠApi Result < T >. also On Success ( on Success Block : Ġ( T ) Ġ-> ĠUnit ): ĠApi Result < T > Ġ{ ĊĠĠĠ Ġif Ġ( this Ġis ĠApi Result . Success ) Ġ{ ĊĠĠĠĠĠĠĠ ĠonSuccess Block ( data ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ /** ĠSyntax Ġs ugar Ġto Ġwrap Ġthe Ġreceiver Ġ[ T ] Ġinto Ġ[ Api Result . Success ] Ġand Ġsupport Ġchaining Ġ*/ Ċ fun Ġ< T Ġ: ĠAny > ĠT . as Success (): ĠApi Result . Success < T > Ġ= ĠApi Result . Success ( this ) Ċ Ċ /** ĠRes olves Ġexceptions Ġto Ġan Ġappropriate ĠApi Result . Failure Ġsubtype Ġ*/ Ċ fun ĠException . as Appro priate Failure (): ĠApi Result . Failure Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcovers ĠSocket TimeoutException Ġand ĠConnect TimeoutException ĊĠĠĠĠĠĠĠ Ġthis Ġis ĠInter rupted IOException Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcovers Ġmultiple Ġapplicable Ġexceptions Ġincluding ĠConnect Exception ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġis ĠSocket Exception Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApi Result . Failure . Network Timeout Failure ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠApi Result . Failure . General Failure ( localized Message . or Empty ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠExec utes Ġ[ block ], Ġconverting Ġany Ġcaught Ġexceptions Ġto Ġ[ Api Result . Failure . General Failure ] Ġwith Ġlogging Ċ Ġ* Ċ Ġ* Ġ@ param ĠclassName ĠName Ġof Ġcalling Ġclass Ġ( for Ġlogging Ġpurposes ) Ċ Ġ* Ġ@ param ĠmethodName ĠName Ġof Ġcalling Ġfunction Ġ( for Ġlogging Ġpurposes ) Ċ Ġ* Ġ@ param Ġblock ĠLambda Ġwith Ġlogic Ġthat Ġreturns Ġthe Ġappropriate Ġ[ Api Result ] Ġresponse Ċ Ġ* Ċ Ġ*/ Ċ suspend Ġfun Ġ< T Ġ: ĠAny > Ġwrap Exceptions ( className : ĠString , ĠmethodName : ĠString , Ġblock : Ġsuspend Ġ() Ġ-> ĠApi Result < T >): ĠApi Result < T > Ġ{ ĊĠĠĠ Ġ@ Suppress (" Too Generic Exception Ca ught ") Ġ// Ġthis Ġmight Ġbe Ġover ly Ġbroad Ġ( catch ing ĠN PE s Ġisn 't Ġideal ) Ġbut Ġnot Ġworth Ġit Ġyet Ġto Ġcheck Ġfor Ġall Ġother Ġpossible Ġtypes Ġ( IO ..., ĠJson ..., Ġothers ) ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . tag ( className ). v (" [$ methodName ]") ĊĠĠĠĠĠĠĠ Ġblock (). also Ġ{ ĠTim ber . tag ( className ). v (" [$ methodName ] Ġresult =$ it ") Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe . as Appro priate Failure (). also Ġ{ ĠTim ber . tag ( className ). w ( e , Ġ" [$ methodName Ġwrap Exceptions ] Ġexception Ġcaught Ġand Ġconverted Ġto Ġfailure : Ġ$ it ") Ġ} ĊĠĠĠ Ġ} Ċ } Ċ