package Ġ` in `. spec matic . core . pattern Ċ Ċ import Ġ` in `. spec matic . core . Resolver Ċ import Ġ` in `. spec matic . core . Result Ċ import Ġ` in `. spec matic . core . mismatch Result Ċ import Ġ` in `. spec matic . core . value . JSONArray Value Ċ import Ġ` in `. spec matic . core . value . JSONObject Value Ċ import Ġ` in `. spec matic . core . value . StringValue Ċ import Ġ` in `. spec matic . core . value . Value Ċ Ċ data Ġclass ĠDictionary Pattern ( val Ġkey Pattern : ĠPattern , Ġval Ġvalue Pattern : ĠPattern , Ġoverride Ġval Ġtype Alias : ĠString ? Ġ= Ġnull ) Ġ: ĠPattern Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġmatches ( sample Data : ĠValue ?, Ġresolver : ĠResolver ): ĠResult Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( sample Data Ġ! is ĠJSONObject Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmismatch Result (" JSON Ġobject ", Ġsample Data ) ĊĊĠĠĠĠĠĠĠ Ġsample Data . jsonObject . forEach Ġ{ Ġ( key , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed Key Ġ= Ġkey Pattern . parse ( key , Ġresolver ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġresult Ġ= Ġresolver . matches Pattern ( null , Ġkey Pattern , Ġparsed Key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Failure Ġ-> Ġreturn Ġresult . bread Cr umb ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠContract Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġe . failure (). bread Cr umb ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed Value Ġ= Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Value Ġ-> Ġvalue Pattern . parse ( value . string , Ġresolver ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġresult Ġ= Ġresolver . matches Pattern ( null , Ġvalue Pattern , Ġparsed Value )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Failure Ġ-> Ġreturn Ġresult . bread Cr umb ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠContract Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġe . failure (). bread Cr umb ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠResult . Success () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate ( resolver : ĠResolver ): ĠValue Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠJSONObject Value (( 1 .. random Number ( RANDOM _ NUMBER _ CE IL ING )). fold ( empty Map ()) Ġ{ Ġobj , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġkey Pattern . generate ( resolver ). toString Literal () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġvalue Pattern . generate ( resolver ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj . plus ( key Ġto Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnew Based On ( row : ĠRow , Ġresolver : ĠResolver ): ĠList < Pattern > Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnewValue Patterns Ġ= Ġvalue Pattern . new Based On ( Row (), Ġresolver ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠnewValue Patterns . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDictionary Pattern ( key Pattern , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnew Based On ( resolver : ĠResolver ): ĠList < Pattern > Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnewValue Patterns Ġ= Ġvalue Pattern . new Based On ( resolver ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠnewValue Patterns . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDictionary Pattern ( key Pattern , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġparse ( value : ĠString , Ġresolver : ĠResolver ): ĠValue Ġ= Ġparsed JSON ( value ) ĊĊĠĠĠ Ġoverride Ġfun Ġen comp asses ( other Pattern : ĠPattern , Ġthis Resolver : ĠResolver , Ġother Resolver : ĠResolver , Ġtype Stack : ĠType Stack ): ĠResult Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( other Pattern ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠExact Value Pattern Ġ-> Ġother Pattern . fits Within ( listOf ( this ), Ġother Resolver , Ġthis Resolver , Ġtype Stack ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! is ĠDictionary Pattern Ġ-> ĠResult . Failure (" Expected Ġdictionary Ġtype , Ġgot Ġ${ other Pattern . typeName }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġbigger En comp asses Small er ( this . key Pattern , Ġother Pattern . key Pattern , Ġthis Resolver , Ġother Resolver , Ġtype Stack ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġbigger En comp asses Small er ( this . value Pattern , Ġother Pattern . value Pattern , Ġthis Resolver , Ġother Resolver , Ġtype Stack ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). as Sequence (). map Ġ{ Ġit . invoke () Ġ}. first OrNull Ġ{ Ġit Ġis ĠResult . Failure Ġ} Ġ?: ĠResult . Success () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠlistOf ( value List : ĠList < Value >, Ġresolver : ĠResolver ): ĠValue Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠJSONArray Value ( value List ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval ĠtypeName : ĠString Ġ= Ġ" object Ġwith Ġkey Ġtype Ġ${ key Pattern . typeName } Ġand Ġvalue Ġtype Ġ${ value Pattern . typeName }" ĊĊĠĠĠ Ġoverride Ġval Ġpattern : ĠAny Ġ= Ġ" (${ without Pattern Delimit ers ( key Pattern . pattern . toString ()) }:${ without Pattern Delimit ers ( value Pattern . pattern . toString ()) })" Ċ } Ċ