package Ġcom . but ter cms . error Ċ Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Callback Ċ import Ġretrofit 2 . Response Ċ import Ġjava . io . IOException Ċ Ċ class ĠRest Call Error ( ĊĠĠĠ Ġval ĠerrorMessage : ĠString ?, ĊĠĠĠ Ġval Ġresponse : ĠResponse < Any >? Ġ= Ġnull , ĊĠĠĠ Ġval Ġkind : ĠKind , ĊĠĠĠ Ġval Ġexception : ĠThrowable ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġerror Body : ĠString ? Ġ= Ġnull Ċ ) Ġ: ĠError ( errorMessage , Ġexception ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIdent ifies Ġthe Ġevent Ġkind Ġwhich Ġtriggered Ġa Ġ[ Rest Call Error ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġenum Ġclass ĠKind Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAn Ġ[ IOException ] Ġoccurred Ġwhile Ġcommunic ating Ġto Ġthe Ġserver . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠNET WORK , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠA Ġnon - 2 0 0 ĠHTTP Ġstatus Ġcode Ġwas Ġreceived Ġfrom Ġthe Ġserver . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠHTTP , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAn Ġinternal Ġerror Ġoccurred Ġwhile Ġattempting Ġto Ġexecute Ġa Ġrequest . ĠIt Ġis Ġbest Ġpractice Ġto ĊĠĠĠĠĠĠĠĠ Ġ* Ġre - throw Ġthis Ġexception Ġso Ġyour Ġapplication Ġcrashes . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠUN EXPECTED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġnetwork Error ( exception : ĠIOException ): ĠRest Call Error Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRest Call Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ= Ġexception . message , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind Ġ= ĠKind . NETWORK , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception Ġ= Ġexception ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġhttp Error ( response : ĠResponse < Any >): ĠRest Call Error Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġresponse . code (). toString () Ġ+ Ġ" Ġ" Ġ+ Ġresponse . message () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRest Call Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ= Ġmessage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= Ġresponse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Body Ġ= Ġresponse . error Body ()?. string (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind Ġ= ĠKind . HTTP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġunexpected Error ( exception : ĠThrowable ): ĠRest Call Error Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRest Call Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ= Ġexception . message , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind Ġ= ĠKind . UN EXPECTED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception Ġ= Ġexception ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ open Ġclass ĠError ( message : ĠString ?, Ġcause : ĠThrowable ?) Ġ: ĠException ( message , Ġcause ) Ċ Ċ fun Ġ< T Ġ: ĠAny > ĠCall < T >. enqueue Call ( callback : ĠResponse Callback < T >. () Ġ-> ĠUnit ) Ġ{ ĊĊĠĠĠ Ġval Ġresponse Callback Ġ= ĠResponse Callback < T >() ĊĠĠĠ Ġcallback . invoke ( response Callback ) ĊĠĠĠ Ġthis . enqueue ( response Callback ) Ċ } Ċ Ċ class ĠResponse Callback < T Ġ: ĠAny > Ġ: ĠCallback < T > Ġ{ ĊĊĠĠĠ Ġvar ĠonSuccess : Ġ(( T ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠ Ġvar ĠonSuccess Empty : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠ Ġvar Ġon Failure : Ġ(( t : ĠRest Call Error ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall < T >, Ġresponse : ĠResponse < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġresponse . body () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( body Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess ?. invoke ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess Empty ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ?. invoke ( Rest Call Error . http Error ( response Ġas ĠResponse < Any > )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < T >, Ġerror : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġwhen Ġ( error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIOException Ġ-> ĠRest Call Error . network Error ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠRest Call Error . unexpected Error ( error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Failure ?. invoke ( e ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ interface ĠCallback < T , ĠE Ġ: ĠRest Call Error ?> Ġ{ ĊĠĠĠ Ġfun Ġsuccess ( response : ĠT ) ĊĠĠĠ Ġfun Ġfailure ( error : ĠE ) Ġ// Ġadd Ġstatus Ġto Ġfailure Ġas Ġwell Ċ } Ċ