package Ġit . pure orig ins . common Ċ Ċ import Ġkotlinx . serialization .* Ċ import Ġkotlinx . serialization . builtins . List Serializer Ċ import Ġkotlinx . serialization . descriptors . Serial Descriptor Ċ import Ġkotlinx . serialization . encoding . Decoder Ċ import Ġkotlinx . serialization . encoding . Encoder Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġorg . bukkit . plugin . java . Java Plugin Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . io . IOException Ċ import Ġjava . lang . Thread . currentThread Ċ import Ġjava . nio . file . Path Ċ import Ġkotlin . io . path .* Ċ import Ġkotlin . reflect . type Of Ċ Ċ val Ġcompact Json Ġ= ĠJson Ġ{ ĊĠĠĠ Ġignore Unknown Keys Ġ= Ġtrue ĊĠĠĠ Ġencode Defaults Ġ= Ġtrue Ċ } Ċ Ċ val Ġjson Ġ= ĠJson ( compact Json ) Ġ{ ĊĠĠĠ Ġpretty Print Ġ= Ġtrue Ċ } Ċ Ċ fun Ġserialization Exception ( file : ĠPath , Ġcause : ĠSerialization Exception ): ĠNothing Ġ= Ġthrow ĠSerialization Exception (" Cannot Ġserialize Ġfile Ġ'$ file '", Ġcause ) Ċ fun Ġde serialization Exception ( file : ĠPath , Ġcause : ĠSerialization Exception ): ĠNothing Ġ= Ġthrow ĠSerialization Exception (" Cannot Ġdeserialize Ġfile Ġ'$ file ' Ġ( update Ġor Ġdelete Ġit )", Ġcause ) Ċ fun Ġio Exception ( file : ĠPath , Ġcause : ĠIOException ): ĠNothing Ġ= Ġthrow ĠIOException (" Cannot Ġaccess Ġfile Ġ'$ file '", Ġcause ) Ċ fun Ġread Exception ( file : ĠPath , Ġcause : ĠThrowable ): ĠNothing Ġ= Ġwhen Ġ( cause ) Ġ{ ĊĠĠĠ Ġis ĠSerialization Exception Ġ-> Ġde serialization Exception ( file , Ġcause ) ĊĠĠĠ Ġis ĠIOException Ġ-> Ġio Exception ( file , Ġcause ) ĊĠĠĠ Ġelse Ġ-> Ġthrow ĠIOException (" Cannot Ġread Ġfile Ġ'$ file '", Ġcause ) Ċ } Ċ fun Ġwrite Exception ( file : ĠPath , Ġcause : ĠThrowable ): ĠNothing Ġ= Ġwhen Ġ( cause ) Ġ{ ĊĠĠĠ Ġis ĠSerialization Exception Ġ-> Ġserialization Exception ( file , Ġcause ) ĊĠĠĠ Ġis ĠIOException Ġ-> Ġio Exception ( file , Ġcause ) ĊĠĠĠ Ġelse Ġ-> Ġthrow ĠIOException (" Cannot Ġwrite Ġfile Ġ'$ file '", Ġcause ) Ċ } Ċ Ċ inline Ġval ĠJava Plugin . directory : ĠPath Ġget () Ġ= Ġdata Folder . to Path () Ċ fun ĠJava Plugin . file ( name : ĠString ): ĠPath Ġ= Ġdirectory . resolve ( name ) Ċ Ċ inline Ġfun Ġ< re ified ĠT > ĠJson . readFile As ( file : ĠPath , Ġde serializer : ĠDeserial ization Strategy < T > Ġ= Ġserializers Module . serializer (), Ġcross inline Ġexception Handler : Ġ( Throwable ) Ġ-> ĠT Ġ= Ġ{ Ġread Exception ( file , Ġit ) Ġ}): ĠT Ġ{ ĊĠĠĠ Ġval Ġtext Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġfile . read Text () ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġexception Handler ( e ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġdecode FromString ( de serializer , Ġtext ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Opt In ( Experimental Std lib Api :: class ) ĊĠĠĠĠĠĠĠ Ġexception Handler ( Serialization Exception (" An Ġerror Ġoccurred Ġwhile Ġde serializing Ġ$ text Ġto Ġ${ type Of < T >() }", Ġe )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT > ĠJson . readFile As ( ĊĠĠĠ Ġfile : ĠPath , ĊĠĠĠ Ġdefault : ĠT , ĊĠĠĠ Ġserializer : ĠK Serializer < T > Ġ= Ġserializers Module . serializer (), ĊĠĠĠ Ġcross inline Ġwrite ExceptionHandler : Ġ( Throwable ) Ġ-> ĠUnit Ġ= Ġ{ Ġwrite Exception ( file , Ġit ) Ġ}, ĊĠĠĠ Ġcross inline Ġexception Handler : Ġ( Throwable ) Ġ-> ĠT Ġ= Ġ{ Ġread Exception ( file , Ġit ) Ġ} Ċ ): ĠT Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite File ( file , Ġdefault , Ġserializer , Ġwrite ExceptionHandler ) ĊĠĠĠĠĠĠĠ Ġdefault ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠreadFile As ( file , Ġserializer , Ġexception Handler ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT > ĠJson . readFile Or Copy ( ĊĠĠĠ Ġfile : ĠPath , ĊĠĠĠ Ġdefault Path : ĠString , ĊĠĠĠ Ġde serializer : ĠDeserial ization Strategy < T > Ġ= Ġserializers Module . serializer (), ĊĠĠĠ Ġclass Loader : ĠClassLoader Ġ= Ġcurrent Thread (). context ClassLoader , ĊĠĠĠ Ġcross inline Ġexception Handler : Ġ( Throwable ) Ġ-> ĠT Ġ= Ġ{ Ġread Exception ( file , Ġit ) Ġ} Ċ ): ĠT Ġ{ ĊĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . parent ?. create Directories () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Loader . getResource AsStream (" config /$ default Path ") ?. use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy To ( file . output Stream ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow ĠFileNotFoundException (" cannot Ġfind Ġresource Ġon Ġ' config /$ default Path '") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexception Handler ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠreadFile As ( file , Ġde serializer , Ġexception Handler ) Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT > ĠJson . writeFile ( ĊĠĠĠ Ġfile : ĠPath , ĊĠĠĠ Ġcontent : ĠT , ĊĠĠĠ Ġserializer : ĠSerialization Strategy < T > Ġ= Ġserializers Module . serializer (), ĊĠĠĠ Ġcross inline Ġexception Handler : Ġ( Throwable ) Ġ-> ĠUnit Ġ= Ġ{ Ġwrite Exception ( file , Ġit ) Ġ} Ċ ) Ġ{ ĊĠĠĠ Ġval Ġtext Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġencode ToString ( serializer , Ġcontent ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġexception Handler ( Serialization Exception (" An Ġerror Ġoccurred Ġwhile Ġserial izing Ġ$ content ", Ġe )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġfile . parent ?. create Directories () ĊĠĠĠĠĠĠĠ Ġfile . write Text ( text ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexception Handler ( e ) ĊĠĠĠ Ġ} Ċ } Ċ