package Ġfi . ri ista . common . model Ċ Ċ import Ġkotlinx . serialization . Serializable Ċ Ċ /** Ċ Ġ* ĠAn Ġinterface Ġfor Ġthe Ġ[ Enum ] s Ġthat Ġcan Ġbe Ġmapped Ġto Ġenums Ġon Ġthe Ġbackend . Ċ Ġ* Ċ Ġ* ĠThe Ġstring Ġvalue Ġof Ġthe Ġbackend Ġenum Ġvalue Ġis Ġto Ġbe Ġheld Ġin Ġ[ raw Backend EnumValue ]. Ċ Ġ*/ Ċ interface ĠRepresents Backend Enum Ġ{ ĊĠĠĠ Ġval Ġraw Backend EnumValue : ĠString Ċ } Ċ Ċ /** Ċ Ġ* ĠWrap s Ġthe Ġraw Ġenum Ġvalue Ġprovided Ġby Ġthe Ġbackend Ġand Ġprovides Ġa Ġway Ġfor Ġtrying Ċ Ġ* Ġto Ġinterpret Ġit Ġas Ġan Ġ[ Enum ] Ġvalue Ġof Ġtype Ġ[ Enum Type ]. Ċ Ġ* Ċ Ġ* ĠThe Ġreason Ġbehind Ġkeeping Ġthe Ġbackend Ġraw Ġenum Ġvalue Ġis Ġthat Ġclient Ġapp Ġcan Ġsafely Ġhandle Ċ Ġ* Ġthe Ġsituation Ġwhere Ġnew Ġenum Ġmembers Ġget Ġadded Ġto Ġthe Ġenum Ġin Ġthe Ġbackend . ĠThe Ġclient Ċ Ġ* Ġwill Ġbe Ġable Ġto Ġinterpret Ġknown Ġvalues Ġand Ġunknown Ġvalues Ġcan Ġstill Ġbe Ġkept Ġun touched Ċ Ġ* Ġusing Ġ[ raw Backend EnumValue ]. Ċ Ġ* Ċ Ġ* ĠThis Ġallows Ġmodifying Ġother Ġobject Ġdata Ġwithout Ġalter ing Ġenum Ġdata Ġ( e . g . Ġchanging Ġh unting Ċ Ġ* Ġday Ġdate Ġwithout Ġalter ing Ġthe Ġh unting Ġmethod ) Ċ Ġ*/ Ċ @ Serializable Ċ data Ġclass ĠBackend Enum < Enum Type >( ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġraw / string Ġvalue Ġof Ġthe Ġenum Ġvalue Ġon Ġthe Ġbackend . ĠAllowed Ġto Ġbe Ġnull ĊĠĠĠĠ Ġ* Ġin Ġcase ĠD TO Ġvalue Ġis Ġnull . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġraw Backend EnumValue : ĠString ?, ĊĠĠĠ Ġprivate Ġval Ġenum Values : ĠList < Enum Type >, Ċ ) Ġwhere ĠEnum Type Ġ: ĠEnum < Enum Type >, ĠEnum Type Ġ: ĠRepresents Backend Enum Ġ{ ĊĊĠĠĠ Ġconstructor ( value : ĠEnum Type ?, Ġvalues : ĠList < Enum Type >): ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ( value ?. raw Backend EnumValue , Ġvalues ) ĊĊĠĠĠ Ġval Ġvalue : ĠEnum Type ? Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġenum Values . first OrNull Ġ{ Ġit . raw Backend EnumValue Ġ== Ġraw Backend EnumValue Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate ( newValue : ĠEnum Type ): ĠBackend Enum < Enum Type > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠBackend Enum ( newValue . raw Backend EnumValue , Ġenum Values ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcannot Ġhave Ġre ified ĠEnum Type Ġis Ġconstructor . ĠUse Ġa Ġseparate Ġfunction Ġinstead . ĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġ< re ified ĠEnum Type > Ġcreate ( value : ĠEnum Type ?): ĠBackend Enum < Enum Type > Ġwhere ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEnum Type Ġ: ĠEnum < Enum Type >, ĠEnum Type Ġ: ĠRepresents Backend Enum Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBackend Enum ( value , Ġenum Values < Enum Type >(). toList ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠWrap Ġthe Ġstring Ġto Ġa Ġ[ Backend Enum ] Ġin Ġorder Ġto Ġallow Ġsafe Ġconversion Ġto Ġan Ċ Ġ* Ġ[ Enum Type ] Ġvalue . Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠEnum Type > ĠString ?. to Backend Enum (): ĊĠĠĠĠĠĠĠ ĠBackend Enum < Enum Type > Ġwhere ĠEnum Type Ġ: ĠEnum < Enum Type >, ĠEnum Type Ġ: ĠRepresents Backend Enum Ġ{ ĊĠĠĠ Ġreturn ĠBackend Enum ( this , Ġenum Values < Enum Type >(). toList ()) Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠEnum Type > ĠEnum Type . to Backend Enum (): ĊĠĠĠĠĠĠĠ ĠBackend Enum < Enum Type > Ġwhere ĠEnum Type Ġ: ĠEnum < Enum Type >, ĠEnum Type Ġ: ĠRepresents Backend Enum Ġ{ ĊĠĠĠ Ġreturn ĠBackend Enum . create ( this ) Ċ }