package Ġcom . hal cy on mobile . error handling . feature . sample Ċ Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . hal cy on mobile . error handler core . Data Layer Exception Ċ import Ġcom . hal cy on mobile . error handler core . Result Wrapper Ċ import Ġcom . hal cy on mobile . error handling . R Ċ import Ġcom . hal cy on mobile . error handling . core . model . User Ċ import Ġcom . hal cy on mobile . error handling . core . use case . Get Users UseCase Ċ import Ġcom . hal cy on mobile . error handling . core . use case . Login UseCase Ċ import Ġcom . hal cy on mobile . error handling . core . use case . Register UseCase Ċ import Ġcom . hal cy on mobile . error handling . error . Api ErrorCode Ċ import Ġcom . hal cy on mobile . error handling . error . Demo App ApiError Ċ import Ġcom . hal cy on mobile . error handling . shared . Consum able Ċ import Ġcom . hal cy on mobile . error handling . shared . error . Error Item Ċ import Ġcom . hal cy on mobile . error handling . shared . error . Error Parser Ċ import Ġcom . hal cy on mobile . error handling . util . cause d By Ċ import Ġcom . hal cy on mobile . error handling . util . exhaustive Ċ import Ġkotlinx . coroutines . launch Ċ import Ġtim ber . log . Tim ber Ċ Ċ class ĠSample ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġregister : ĠRegister UseCase , ĊĠĠĠ Ġprivate Ġval Ġlogin : ĠLogin UseCase , ĊĠĠĠ Ġprivate Ġval Ġget Users : ĠGet Users UseCase , ĊĠĠĠ Ġprivate Ġval Ġerror Parser : ĠError Parser Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġval ĠuserName Ġ= ĠMutable LiveData (" userName ") ĊĠĠĠ Ġval Ġpassword Ġ= ĠMutable LiveData (" password ") ĊĊĠĠĠ Ġprivate Ġval Ġ_ last Response Ġ= ĠMutable LiveData < String >() ĊĠĠĠ Ġval Ġlast Response : ĠLive Data < String > Ġget () Ġ= Ġ_ last Response ĊĊĠĠĠ Ġprivate Ġval Ġ_ event Ġ= ĠMutable LiveData < Consum able < Event >>() ĊĠĠĠ Ġval Ġevent : ĠLive Data < Consum able < Event >> Ġget () Ġ= Ġ_ event ĊĊĠĠĠ Ġ// Ġregion ĠRegistration ĊĠĠĠ Ġfun Ġregister User () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġresult Ġ= Ġregister ( userName . value . or Empty (), Ġ" firstName ", Ġ" lastName ", Ġ" email @ email . com ", Ġpassword . value . or Empty ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult Wrapper . Success Ġ-> Ġhandle Registration Success ( result . data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult Wrapper . Error Ġ-> Ġhandle Registration Error ( result . data Layer Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult Wrapper . Exception Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( result . exception , Ġ"[ Exception ] Ġ${ result . exception }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ last Response . value Ġ= Ġ"[ Exception ] Ġ${ result . exception }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ event . value Ġ= ĠCon sum able ( Event . User Action Failed ( Error Item ( R . string . error _ something _ w ent _ wrong , Ġnull , Ġnull , Ġnull ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. exhaustive ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Registration Success ( user : ĠUser ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ("[ Success ] Ġ$ user ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ last Response . value Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Registration Error ( data Layer Exception : ĠData Layer Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ("[ Error ] Ġ$ data Layer Exception ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( data Layer Exception Ġas ? ĠDemo App ApiError )?. payload ?. cause d By ( Api ErrorCode . USERNAME _ TA KEN ) Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠError Item ( R . string . error _ username _ taken , Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Parser . extract Error Info From Exception ( data Layer Exception , Ġ:: register User , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ last Response . value Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ event . value Ġ= ĠCon sum able ( Event . User Action Failed ( error )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġend region ĠRegistration ĊĊĠĠĠ Ġ// Ġregion ĠLogin ĊĠĠĠ Ġfun Ġlogin User () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġresult Ġ= Ġlogin ( userName . value . or Empty (), Ġpassword . value . or Empty ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult Wrapper . Success Ġ-> Ġhandle Login Success ( result . data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult Wrapper . Error Ġ-> Ġhandle Login Error ( result . data Layer Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult Wrapper . Exception Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( result . exception , Ġ"[ Exception ] Ġ${ result . exception }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ last Response . value Ġ= Ġ"[ Exception ] Ġ${ result . exception }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ event . value Ġ= ĠCon sum able ( Event . User Action Failed ( Error Item ( R . string . error _ something _ w ent _ wrong , Ġnull , Ġnull , Ġnull ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. exhaustive ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Login Success ( user : ĠUser ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ("[ Success ] Ġ$ user ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ last Response . value Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Login Error ( data Layer Exception : ĠData Layer Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ("[ Error ] Ġ$ data Layer Exception ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ last Response . value Ġ= Ġthis ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġif Ġ(( data Layer Exception Ġas ? ĠDemo App ApiError )?. payload ?. cause d By ( Api ErrorCode . INVALID _ CRED ENTIAL S ) Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠError Item ( R . string . error _ invalid _ credentials , Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Parser . extract Error Info From Exception ( data Layer Exception , Ġ:: login User , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ event . value Ġ= ĠCon sum able ( Event . User Action Failed ( error )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġend region ĠLogin ĊĊĠĠĠ Ġ// Ġregion ĠUsers ĊĠĠĠ Ġfun ĠgetUser List () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġresult Ġ= Ġget Users ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult Wrapper . Success Ġ-> Ġhandle Users Success ( result . data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult Wrapper . Error Ġ-> Ġhandle Users Error ( result . data Layer Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult Wrapper . Exception Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( result . exception , Ġ"[ Exception ] Ġ${ result . exception }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ last Response . value Ġ= Ġ"[ Exception ] Ġ${ result . exception }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ event . value Ġ= ĠCon sum able ( Event . User Action Failed ( Error Item ( R . string . error _ something _ w ent _ wrong , Ġnull , Ġnull , Ġnull ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. exhaustive ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Users Success ( users : ĠList < User >) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ("[ Success ] Ġ$ users ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ last Response . value Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Users Error ( data Layer Exception : ĠData Layer Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ("[ Error ] Ġ$ data Layer Exception ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ last Response . value Ġ= Ġthis ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ event . value Ġ= ĠCon sum able ( Event . User Action Failed ( error Parser . extract Error Info From Exception ( data Layer Exception , Ġ:: getUser List , Ġnull ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġend region ĠUsers ĊĊĠĠĠ Ġsealed Ġclass ĠEvent Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠUser Action Failed ( val Ġerror Item : ĠError Item ) Ġ: ĠEvent () ĊĠĠĠ Ġ} Ċ }