/* Ċ Ġ* ĠCopyright ĠAmazon . com , ĠInc . Ġor Ġits Ġaffiliates . ĠAll ĠRights ĠReserved . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "). Ċ Ġ* ĠYou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠA Ġcopy Ġof Ġthe ĠLicense Ġis Ġlocated Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* Ġor Ġin Ġthe Ġ" license " Ġfile Ġaccompanying Ġthis Ġfile . ĠThis Ġfile Ġis Ġdistributed Ċ Ġ* Ġon Ġan Ġ" AS ĠIS " ĠBASIS , ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ċ Ġ* Ġexpress Ġor Ġimplied . ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ċ Ġ* Ġ Ġpermissions Ġand Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . part i ql . pig . domain . model Ċ Ċ import Ġcom . amazon . ion element . api . Ion Location Ċ import Ġcom . amazon . ion element . api . Meta Container Ċ import Ġcom . amazon . ion element . api . location Ċ import Ġorg . part i ql . pig . errors . P ig Exception Ċ import Ġorg . part i ql . pig . errors . Error Context Ċ import Ġorg . part i ql . pig . errors . P ig Error Ċ Ċ /** Ċ Ġ* ĠEn caps ulates Ġall Ġerror Ġcontext Ġinformation Ġin Ġan Ġeasily Ġtest able Ġway . Ċ Ġ* Ċ Ġ* ĠTODO : Ġ Ġuse Ġone Ġclass Ġderived Ġfrom Ġ[ Semantic Error Context ] Ġper Ġlocation Ġwhere Ġan Ġerror Ġmay Ġbe Ġthrown ? ĠThis Ġmakes Ċ Ġ* ĠĠĠĠĠĠĠ Ġbeing Ġsure Ġthat Ġevery Ġerror Ġcondition Ġis Ġtested Ġeasier Ġbut Ġcomp lic ates Ġ[ Semantic Error Context ] Ġdue Ċ Ġ* ĠĠĠĠĠĠĠ Ġto Ġthe Ġincreased Ġnumber Ġof Ġderived Ġclasses . Ġ( Currently Ġ[ Name Already Used ] Ġis Ġused Ġat Ġseveral Ġplaces .) Ċ Ġ*/ Ċ sealed Ġclass ĠSemantic Error Context ( val Ġmsg Formatter : Ġ() Ġ-> ĠString ): ĠError Context Ġ{ ĊĠĠĠ Ġoverride Ġval Ġmessage : ĠString Ġget () Ġ= Ġmsg Formatter () ĊĊĠĠĠ Ġobject ĠEmpty Un iverse ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" The Ġuniverse Ġwas Ġempty " Ġ}) ĊĊĠĠĠ Ġdata Ġclass ĠUndefined Type ( val ĠtypeName : ĠString ) ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" Undefined Ġtype : Ġ'$ typeName '" }) ĊĊĠĠĠ Ġdata Ġclass ĠNot A TypeName ( val Ġvariant Name : ĠString ) ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" Cannot Ġuse Ġa Ġvariant Ġname Ġ'$ variant Name ' Ġhere "}) ĊĊĠĠĠ Ġobject ĠRequired Element After Optional ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" Required Ġfields Ġnot Ġallowed Ġafter Ġoptional Ġfields "}) ĊĊĠĠĠ Ġobject ĠProduct Cannot Have Both Optional And Vari adic Elements ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" A Ġproduct Ġcannot Ġhave Ġboth Ġoptional Ġand Ġvari adic Ġfields "}) ĊĊĠĠĠ Ġobject ĠRequired Element After Vari adic ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" Required Ġfields Ġare Ġnot Ġallowed Ġafter Ġa Ġvari adic Ġfield " Ġ}) ĊĊĠĠĠ Ġobject ĠOptional Element After Vari adic ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" Optional Ġfields Ġare Ġnot Ġallowed Ġafter Ġa Ġvari adic Ġfield "}) ĊĊĠĠĠ Ġobject ĠMore Than One Vari adic Element ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" A Ġproduct Ġmay Ġnot Ġhave Ġmore Ġthan Ġone Ġvari adic Ġfield " Ġ}) ĊĊĠĠĠ Ġobject ĠOptional Ion Type Element ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" A Ġproduct Ġmay Ġnot Ġhave Ġoptional ĠIon Ġtype Ġfield " Ġ}) ĊĊĠĠĠ Ġobject ĠEmpty Record ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" Records Ġmust Ġhave Ġat Ġleast Ġone Ġfield " Ġ}) ĊĊĠĠĠ Ġdata Ġclass ĠCannot Remove Builtin Type ( val ĠtypeName : ĠString ) ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" Cannot Ġremove Ġbuilt - in Ġtype Ġ'$ typeName '" Ġ}) ĊĊĠĠĠ Ġdata Ġclass ĠDuplicate Type DomainName ( val Ġdomain Name : ĠString ) ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" Duplicate Ġtype Ġdomain Ġtag : Ġ'${ domain Name } Ġ" }) ĊĊĠĠĠ Ġdata Ġclass ĠDuplicate Record Element Tag ( val Ġelement Name : ĠString ) ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" Duplicate Ġrecord Ġelement Ġtag : Ġ'${ element Name } Ġ" }) ĊĊĠĠĠ Ġdata Ġclass ĠDuplicate Element Identifier ( val Ġelement Name : ĠString ) ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" Duplicate Ġelement Ġidentifier : Ġ'${ element Name } Ġ" }) ĊĊĠĠĠ Ġdata Ġclass ĠName Already Used ( val Ġname : ĠString , Ġval Ġdomain Name : ĠString ) ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" Name Ġ'$ name ' Ġwas Ġpreviously Ġused Ġin Ġthe Ġ`$ domain Name ` Ġtype Ġdomain " Ġ}) ĊĊĠĠĠ Ġdata Ġclass ĠCannot Remove Non Ex istent Sum Variant ( val Ġsum TypeName : ĠString , Ġval Ġvariant Name : ĠString ) ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" Per muted Ġsum Ġtype Ġ'${ sum TypeName }' Ġtries Ġto Ġremove Ġvariant Ġ'${ variant Name }' Ġwhich Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" does Ġnot Ġexist Ġin Ġthe Ġoriginal Ġsum Ġtype " Ġ}) ĊĊĠĠĠ Ġdata Ġclass ĠDomain Per mut es Non Ex istent Domain ( val Ġdomain Name : ĠString , Ġval Ġper muted Domain : ĠString ) ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" Domain Ġ'$ domain Name ' Ġper mut es Ġnon - existent Ġdomain Ġ'$ per muted Domain '" }) ĊĊĠĠĠ Ġdata Ġclass ĠCannot Remove Non Ex istent Type ( val ĠtypeName : ĠString , Ġval Ġper mut ing Domain : ĠString , Ġval Ġperm ute e Domain : ĠString ) ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" Domain Ġ'$ per mut ing Domain ' Ġtries Ġto Ġremove Ġtype Ġ'$ typeName ', Ġwhich Ġdoes Ġnot Ġexist Ġin Ġthe Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" domain Ġbeing Ġper muted : Ġ'$ perm ute e Domain '. " Ġ}) ĊĊĠĠĠ Ġdata Ġclass ĠCannot Perm ute Non Ex istent Sum ( val ĠtypeName : ĠString , Ġval Ġper mut ing Domain : ĠString , Ġval Ġperm ute e Domain : ĠString ) ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" Domain Ġ'$ per mut ing Domain ' Ġtries Ġto Ġperm ute Ġtype Ġ'$ typeName ', Ġwhich Ġdoes Ġnot Ġexist Ġin Ġthe Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" domain Ġbeing Ġper muted : Ġ'$ perm ute e Domain '. " Ġ}) ĊĊĠĠĠ Ġdata Ġclass ĠCannot Perm ute Non Sum Type ( val ĠtypeName : ĠString ) ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" Cannot Ġperm ute Ġtype Ġ'$ typeName ' Ġbecause Ġit Ġis Ġnot Ġa Ġsum " Ġ}) ĊĊĠĠĠ Ġdata Ġclass ĠEmpty Sum Type ( val Ġsum TypeName : ĠString ) ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" Sum Ġtype Ġ'$ sum TypeName ' Ġis Ġempty " Ġ}) ĊĊĠĠĠ Ġdata Ġclass ĠSource Domain DoesNotExist ( val Ġname : ĠString ) ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" Source Ġdomain Ġ'$ name ' Ġdoes Ġnot Ġexist " Ġ}) ĊĊĠĠĠ Ġdata Ġclass ĠDestination Domain DoesNotExist ( val Ġname : ĠString ) ĊĠĠĠĠĠĠĠ Ġ: ĠSemantic Error Context ({ Ġ" Destination Ġdomain Ġ'$ name ' Ġdoes Ġnot Ġexist " Ġ}) Ċ } Ċ Ċ /** Ċ Ġ* ĠShort cut Ġfor Ġthrowing Ġ[ P ig Exception ] Ġwith Ġthe Ġspecified Ġmet as Ġand Ġ[ P ig Error ]. Ċ Ġ*/ Ċ fun Ġsemantic Error ( bl ame : ĠMeta Container , Ġcontext : ĠError Context ): ĠNothing Ġ= ĊĠĠĠ Ġsemantic Error ( bl ame . location , Ġcontext ) Ċ /** Ċ Ġ* ĠShort cut Ġfor Ġthrowing Ġ[ P ig Exception ] Ġwith Ġthe Ġspecified Ġmet as Ġand Ġ[ P ig Error ]. Ċ Ġ*/ Ċ fun Ġsemantic Error ( bl ame : ĠIon Location ?, Ġcontext : ĠError Context ): ĠNothing Ġ= ĊĠĠĠ Ġthrow ĠP ig Exception ( P ig Error ( bl ame , Ġcontext )) Ċ