/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 . ĠJetBrains Ġs . r . o . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠMIT Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġjet brains . datal ore . base . json Ċ Ċ class ĠJson Formatter Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbuffer : ĠStringBuilder ĊĊĠĠĠ Ġfun Ġformat Json ( o : ĠAny ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġbuffer Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġhandle Value ( o ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbuffer . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle List ( list : ĠList <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġappend ("[ ") ĊĠĠĠĠĠĠĠ Ġlist . head Tail (:: handle Value ) Ġ{ Ġtail Ġ-> Ġtail . forEach Ġ{ Ġappend (","); Ġhandle Value ( it ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġappend (" ]") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Map ( map : ĠMap < *, Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġappend ("{ ") ĊĠĠĠĠĠĠĠ Ġmap . entries . head Tail (:: handle Pair ) Ġ{ Ġtail Ġ-> Ġtail . forEach Ġ{ Ġappend (", \ n "); Ġhandle Pair ( it ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġappend (" }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Value ( v : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( v ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġappend (" null ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Ġ-> Ġhandle String ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNumber , ĠBoolean Ġ-> Ġappend ( v . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠArray < *> Ġ-> Ġhandle List ( v . asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList < *> Ġ-> Ġhandle List ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMap < *, Ġ*> Ġ-> Ġhandle Map ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Can 't Ġserialize Ġobject Ġ$ v ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Pair ( pair : ĠMap . Entry < Any ?, ĠAny ?> ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandle String ( pair . key ); Ġappend (": "); Ġhandle Value ( pair . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle String ( v : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( v ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Ġ-> Ġappend ("\" ${ v . escape ()} \" ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Expected Ġa Ġstring , Ġbut Ġgot Ġ'${ v :: class . simple Name }' ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġappend ( s : ĠString ) Ġ= Ġbuffer . append ( s ) ĊĊĠĠĠ Ġprivate Ġfun Ġ< E > ĠCollection < E >. head Tail ( head : Ġ( E ) Ġ-> ĠUnit , Ġtail : Ġ( Sequence < E >) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead ( first ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtail ( as Sequence (). drop ( 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ