/* Ċ Ġ* ĠThis ĠSource ĠCode ĠForm Ġis Ġsubject Ġto Ġthe Ġterms Ġof Ġthe ĠMozilla ĠPublic Ċ Ġ* ĠLicense , Ġv . Ġ 2 . 0 . ĠIf Ġa Ġcopy Ġof Ġthe ĠM PL Ġwas Ġnot Ġdistributed Ġwith Ġthis Ċ Ġ* Ġfile , ĠYou Ġcan Ġobtain Ġone Ġat Ġhttps :// mozilla . org / MPL / 2 . 0 /. Ċ Ġ*/ Ċ Ċ @ file : Suppress ( ĊĠĠĠ Ġ" StringLiteral Dup lication " Ċ ) Ċ Ċ package Ġcom . kot l ind is cord . k ord . extensions . modules . annotations . converters . builders Ċ Ċ import Ġcom . kot l ind is cord . k ord . extensions . modules . annotations . contains Any Ċ import Ġcom . kot l ind is cord . k ord . extensions . modules . annotations . converters . Converter Type Ċ import Ġcom . kot l ind is cord . k ord . extensions . modules . annotations . converters . to Capital ized Ċ import Ġorg . k oin . core . component . K oin Component Ċ Ċ /** Ċ Ġ* ĠBuilder Ġclass Ġthat Ġitself Ġbuilds Ġconverter Ġbuilder Ġclasses . ĠMeta , ĠI Ġknow . Ċ Ġ* Ċ Ġ* ĠThis Ġis Ġa Ġfairly Ġmess y Ġclass Ġcontaining Ġa Ġstring Ġbuilder , Ġbut Ġwhat Ġcan Ġyou Ġdo ? Ċ Ġ*/ Ċ public Ġclass ĠConverter Builder Class Builder Ġ: ĠK oin Component Ġ{ ĊĠĠĠ Ġ/** ĠComment Ġto Ġprepend Ġto Ġthe Ġclass Ġdefinition . Ġ**/ ĊĠĠĠ Ġpublic Ġvar Ġcomment : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĠConverter Ġname Ġ- Ġeg , Ġ`" ${ name } Converter Builder " `. Ġ**/ ĊĠĠĠ Ġpublic Ġlateinit Ġvar Ġname : ĠString ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConverter Ġclass Ġ- Ġclass Ġthat Ġshould Ġbe Ġinstantiated Ġto Ġconstruct Ġthe Ġconverter . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠTech n ically Ġcould Ġbe Ġa Ġfunction , Ġbut Ġthis Ġwould Ġbe Ġplaying Ġwith Ġfire . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġlateinit Ġvar Ġconverter Class : ĠString ĊĊĠĠĠ Ġ/** ĠArgument Ġtype , Ġthe Ġtype Ġthe Ġuser Ġshould Ġultimately Ġbe Ġgiven Ġafter Ġparsing . Ġ**/ ĊĠĠĠ Ġpublic Ġlateinit Ġvar Ġargument Type : ĠString ĊĊĠĠĠ Ġ/** ĠBuilder Ġgeneric Ġparams , Ġif Ġany . ĠO mit Ġthe Ġ`< >`. Ġ**/ ĊĠĠĠ Ġpublic Ġvar Ġbuilder Generic : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĠExtra Ġgeneric Ġbounds Ġto Ġplace Ġafter Ġ` where ` Ġin Ġthe Ġbuilder Ġsignature . Ġ**/ ĊĠĠĠ Ġpublic Ġvar Ġwhere Suffix : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġinternal Ġval Ġbuilder Arguments : ĠMutable List < String > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġinternal Ġval Ġbuilder Argument Names : ĠMutable List < String > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġinternal Ġval Ġbuilder Fields : ĠMutable List < String > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġinternal Ġval Ġbuilder Field Names : ĠMutable List < String > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġinternal Ġval Ġbuilder Extra Statements : ĠMutable List < String > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġinternal Ġval Ġbuilder Init Statements : ĠMutable List < String > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġinternal Ġval Ġtypes : ĠMutable Set < Converter Type > Ġ= Ġmutable Set Of () ĊĊĠĠĠ Ġinternal Ġvar Ġconverter Type : ĠString Ġ= Ġ"" ĊĠĠĠ Ġinternal Ġvar Ġfunction Suffix : ĠString Ġ= Ġ"" ĊĠĠĠ Ġinternal Ġvar Ġbuilder Type : ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġ/** ĠThe Ġult imate Ġresult , Ġthe Ġfinal Ġstring Ġcreated Ġafter Ġcalling Ġ[ build ]. Ġ**/ ĊĠĠĠ Ġpublic Ġvar Ġresult : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĠAdd Ġa Ġbuilder Ġconstructor Ġargument . Ġ**/ ĊĠĠĠ Ġpublic Ġfun Ġbuilder Arg ( arg : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder Arguments . add ( arg ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! arg . startsWith (" !! ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder Argument Names . add ( arg . split (": "). first (). split (" Ġ"). last ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠAdd Ġa Ġbuilder Ġfield . Ġ**/ ĊĠĠĠ Ġpublic Ġfun Ġbuilder Field ( field : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder Fields . add ( field ) ĊĠĠĠĠĠĠĠ Ġbuilder Field Names . add ( field . split (": "). first (). split (" Ġ"). last ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠAdd Ġa Ġbuilder Ġinit Ġstatement . Ġ**/ ĊĠĠĠ Ġpublic Ġfun Ġbuilder Extra Statement ( line : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder Extra Statements . add ( line ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠAdd Ġa Ġbuilder Ġinit Ġstatement . Ġ**/ ĊĠĠĠ Ġpublic Ġfun Ġbuilder Init Statement ( line : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder Init Statements . add ( line ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSpecify Ġthe Ġconverter Ġtypes Ġthat Ġthis Ġbuilder Ġconcerns . Ġ**/ ĊĠĠĠ Ġpublic Ġfun Ġtypes ( var arg Ġtypes : ĠConverter Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtypes ( types . toList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSpecify Ġthe Ġconverter Ġtypes Ġthat Ġthis Ġbuilder Ġconcerns . Ġ**/ ĊĠĠĠ Ġpublic Ġfun Ġtypes ( types : ĠCollection < Converter Type >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . types . addAll ( types ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠBuild Ġthe Ġstring Ġthat Ġcontains Ġthis Ġbuilder 's Ġcode . ĠIt 's Ġalso Ġstored Ġin Ġ[ result ]. Ġ**/ ĊĠĠĠ Ġpublic Ġfun Ġbuild (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder Type Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( comment Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" /** \ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomment !!. lines (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" Ġ* Ġ$ it \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" Ġ*/ \ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuilder . append (" public Ġclass Ġ") ĊĊĠĠĠĠĠĠĠ Ġtypes . groupBy Ġ{ Ġit . order Ġ}. forEach Ġ{ Ġ(_, Ġentries ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entries . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Only Ġone Ġof Ġthe Ġfollowing Ġconverter Ġtypes Ġmay Ġbe Ġspecified Ġat Ġonce : Ġ${ entries . join ToString () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġconverter Type Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtypes . sorted By Ġ{ Ġit . order Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . append Fragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( it . fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder Type Ġ= Ġthis . toString () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ+ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Converter Type . CHO ICE Ġin Ġtypes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Choice " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ+ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Converter Builder " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( builder Type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( builder Generic Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" Ġ<$ builder Generic >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" (" ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( builder Arguments . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ("\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder Arguments . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠ Ġ${ it . trim (' !', Ġ' Ġ') }, \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ) Ġ: Ġ${ this } Converter Builder <$ argument Type >() ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Converter Type . SINGLE Ġin Ġtypes Ġ&& Ġthis . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Single ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Converter ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Converter Type . CHO ICE Ġin Ġtypes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (", ĠChoice Converter Builder <$ argument Type >") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( where Suffix Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" Ġwhere Ġ$ where Suffix ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuilder . append (" Ġ{\ n ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Converter Type . CHO ICE Ġin Ġtypes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠ Ġoverride Ġvar Ġchoices : ĠMutable Map < String , Ġ$ argument Type > Ġ= Ġmutable Map Of ()\ n \ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( builder Fields . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder Fields . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠ Ġ$ it \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ("\ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( builder Init Statements . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠ Ġinit Ġ{\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder Init Statements . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠ Ġ$ it \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠ Ġ}\ n \ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( builder Extra Statements . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder Extra Statements . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠ Ġ$ it \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ("\ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠ Ġpublic Ġoverride Ġfun Ġbuild ( arguments : ĠArguments ): Ġ$ converter Type <$ argument Type > Ġ{\ n ") ĊĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠ Ġreturn Ġarguments . arg (\ n ") ĊĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠĠĠĠĠ ĠdisplayName Ġ= Ġname ,\ n ") ĊĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġdescription ,\ n ") ĊĠĠĠĠĠĠĠ Ġbuilder . append ("\ n ") ĊĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠĠĠĠĠ Ġconverter Ġ= Ġ$ converter Class (\ n ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! types . contains Any ( Converter Type . LIST , ĠConverter Type . OPTIONAL , ĠConverter Type . DEFAULT ING )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidator Ġ= Ġvalidator ,\ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Converter Type . CHO ICE Ġin Ġtypes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchoices Ġ= Ġchoices ,\ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuilder Argument Names . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ$ it Ġ= Ġ$ it ,\ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuilder Field Names . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ$ it Ġ= Ġ$ it ,\ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠĠĠĠĠ Ġ) ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( types . contains ( Converter Type . DEFAULT ING )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (". to Default ing (\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdefaultValue Ġ= ĠdefaultValue ,\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Error Ġ= Ġ! ignore Errors ,\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnested Validator Ġ= Ġvalidator ,\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠĠĠĠĠ Ġ) ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( types . contains ( Converter Type . OPTIONAL )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (". to Optional (\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Error Ġ= Ġ! ignore Errors ,\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnested Validator Ġ= Ġvalidator ,\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠĠĠĠĠ Ġ) ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( types . contains ( Converter Type . LIST )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (". toList (\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequired Ġ= Ġ! ignore Errors ,\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnested Validator Ġ= Ġvalidator ,\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠĠĠĠĠ Ġ) ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuilder . append (". with Builder ( this )") ĊĊĠĠĠĠĠĠĠ Ġbuilder . append ("\ n ") ĊĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠ Ġ) \ n ") ĊĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠ Ġ}\ n ") ĊĊĠĠĠĠĠĠĠ Ġval Ġlate Init Ġ= Ġbuilder Fields ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . contains (" late init Ġvar ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . split (": "). first () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . split (" Ġ"). last () Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( late Init . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ("\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠ Ġoverride Ġfun Ġvalidate Argument () Ġ{\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠ Ġsuper . validate Argument ()\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlate Init . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ("\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠ Ġif Ġ(! this ::$ it . isInitialized ) Ġ{\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalidArgumentException ( this , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\" Required Ġfield Ġnot Ġprovided : Ġ$ it \") \ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠĠĠĠĠ Ġ}\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ĠĠĠ Ġ}\ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuilder . append (" }\ n ") ĊĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġbuilder . toString () ĊĊĠĠĠĠĠĠĠ Ġfunction Suffix Ġ= Ġconverter Type . remove Suffix (" Converter ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġget FunctionName ( given Name : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbefore : ĠMutable List < String > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġval Ġafter : ĠMutable List < String > Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( type Ġin Ġtypes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConverter Type . DEFAULT ING Ġ-> Ġbefore . add (" default ing ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConverter Type . LIST Ġ-> Ġafter . add (" list ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConverter Type . OPTIONAL Ġ-> Ġbefore . add (" optional ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConverter Type . CO AL ESC ING Ġ-> Ġbefore . add (" co ale sc ing ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConverter Type . CHO ICE Ġ-> Ġafter . add (" choice ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConverter Type . SINGLE Ġ-> Ġ{ Ġ/* ĠDon 't Ġadd Ġanything Ġ*/ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcapital ize Name Ġ= Ġbefore . isNotEmpty () ĊĠĠĠĠĠĠĠ Ġvar Ġfirst String Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġval Ġresult String Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbefore . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first String ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst String Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( it . to Capital ized ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( capitalize Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( given Name . to Capital ized ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( given Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( it . to Capital ized ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult String ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** ĠDSL Ġfunction Ġto Ġeasily Ġbuild Ġa Ġconverter Ġbuilder Ġclass . ĠReturns Ġthe Ġbuilder . Ġ**/ Ċ public Ġfun Ġbuilder Class ( body : ĠConverter Builder Class Builder . () Ġ-> ĠUnit ): ĠConverter Builder Class Builder Ġ{ ĊĠĠĠ Ġval Ġbuilder Ġ= ĠConverter Builder Class Builder () ĊĊĠĠĠ Ġbody ( builder ) ĊĊĠĠĠ Ġbuilder . build () ĊĊĠĠĠ Ġreturn Ġbuilder Ċ } Ċ Ċ /** Ġ@ suppress ĠTODO : ĠRemove Ġthis Ġlater , Ġit 's Ġfor Ġtesting Ġ**/ Ċ public Ġfun Ġmain () Ġ{ ĊĠĠĠ Ġprintln ( ĊĠĠĠĠĠĠĠ Ġbuilder Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" enum " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconverter Class Ġ= Ġ" Enum Converter " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargument Type Ġ= Ġ" E " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder Generic Ġ= Ġ" E : ĠEnum < E >" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder Arg (" public Ġvar Ġgetter : Ġsuspend Ġ( String ) Ġ-> ĠE ?") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder Field (" public Ġlateinit Ġvar ĠtypeName : ĠString ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder Field (" public Ġvar Ġbundle : ĠString ? Ġ= Ġnull ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtypes ( Converter Type . CO AL ESC ING ) ĊĠĠĠĠĠĠĠ Ġ}. result ĊĠĠĠ Ġ) Ċ } Ċ