/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 , Ġhttp :// www . s na key aml . org Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 , ĠChris ĠCl if ton Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġ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 Ġuk . org . j urg . y ak l . engine . v 2 . serializer Ċ Ċ import Ġuk . org . j urg . y ak l . engine . v 2 . api . Dump Settings Ċ import Ġuk . org . j urg . y ak l . engine . v 2 . common . Anchor Ċ import Ġuk . org . j urg . y ak l . engine . v 2 . emitter . Emit able Ċ import Ġuk . org . j urg . y ak l . engine . v 2 . events . Alias Event Ċ import Ġuk . org . j urg . y ak l . engine . v 2 . events . Document End Event Ċ import Ġuk . org . j urg . y ak l . engine . v 2 . events . Document Start Event Ċ import Ġuk . org . j urg . y ak l . engine . v 2 . events . Implicit Tuple Ċ import Ġuk . org . j urg . y ak l . engine . v 2 . events . Mapping End Event Ċ import Ġuk . org . j urg . y ak l . engine . v 2 . events . Mapping Start Event Ċ import Ġuk . org . j urg . y ak l . engine . v 2 . events . Scalar Event Ċ import Ġuk . org . j urg . y ak l . engine . v 2 . events . Sequence End Event Ċ import Ġuk . org . j urg . y ak l . engine . v 2 . events . Sequence Start Event Ċ import Ġuk . org . j urg . y ak l . engine . v 2 . events . Stream End Event Ċ import Ġuk . org . j urg . y ak l . engine . v 2 . events . Stream Start Event Ċ import Ġuk . org . j urg . y ak l . engine . v 2 . nodes . Anchor Node Ċ import Ġuk . org . j urg . y ak l . engine . v 2 . nodes . Collection Node Ċ import Ġuk . org . j urg . y ak l . engine . v 2 . nodes . Mapping Node Ċ import Ġuk . org . j urg . y ak l . engine . v 2 . nodes . Node Ċ import Ġuk . org . j urg . y ak l . engine . v 2 . nodes . NodeType Ċ import Ġuk . org . j urg . y ak l . engine . v 2 . nodes . Scalar Node Ċ import Ġuk . org . j urg . y ak l . engine . v 2 . nodes . Sequence Node Ċ import Ġuk . org . j urg . y ak l . engine . v 2 . nodes . Tag Ċ Ċ class ĠSerializer ( private Ġval Ġsettings : ĠDump Settings , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġemit able : ĠEmit able Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġserialized Nodes : ĠMutable Set < Node > Ġ= Ġmutable Set Of () ĊĠĠĠ Ġprivate Ġvar Ġanchors : ĠMutable Map < Node , ĠAnchor ?> Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġfun Ġserialize ( node : ĠNode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . emit able . emit ( Document Start Event ( settings . explicit Start , Ġsettings . yaml Directive , Ġsettings . tag Directive )) ĊĠĠĠĠĠĠĠ Ġanchor Node ( node ) ĊĠĠĠĠĠĠĠ Ġsettings . explicit Root Tag ?. let Ġ{ Ġnode . tag Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġserialize Node ( node ) ĊĠĠĠĠĠĠĠ Ġthis . emit able . emit ( Document End Event ( settings . explicit End )) ĊĠĠĠĠĠĠĠ Ġthis . serialized Nodes . clear () ĊĠĠĠĠĠĠĠ Ġthis . anchors . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġopen () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . emit able . emit ( Stream Start Event ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġemit able . emit ( Stream End Event ()) ĊĠĠĠĠĠĠĠ Ġ// Ġclean Ġup Ġthe Ġresources ĊĠĠĠĠĠĠĠ Ġanchors . clear () ĊĠĠĠĠĠĠĠ Ġserialized Nodes . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġanchor Node ( node : ĠNode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreal Node Ġ= Ġif Ġ( node . nodeType Ġ=== ĠNode Type . AN CH OR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( node Ġas ĠAnchor Node ). real Node ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( anchors . containsKey ( real Node )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġlooks Ġweird , Ġanchors Ġdoes Ġcontain Ġthe Ġkey Ġnode Ġbut Ġwe Ġcall Ġcompute If Absent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġis Ġbecause Ġthe Ġvalue Ġis Ġnull Ġ( HashMap Ġpermit s Ġvalues Ġto Ġbe Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġanchors [ real Node ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanchors [ real Node ] Ġ= Ġsettings . anchor Generator . next Anchor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreal Node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanchors [ real Node ] Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( real Node . nodeType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNode Type . SEQUENCE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseq Node Ġ= Ġreal Node Ġas ĠSequence Node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseq Node . value . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanchor Node ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNode Type . MAPPING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmapping Node Ġ= Ġreal Node Ġas ĠMapping Node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmapping Node . value . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanchor Node ( it . key Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanchor Node ( it . value Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġserialize Node ( node 2 : ĠNode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġif Ġ( node 2 . nodeType Ġ== ĠNode Type . AN CH OR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( node 2 Ġas ĠAnchor Node ). real Node ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġt Alias Ġ= Ġanchors [ node ] ĊĠĠĠĠĠĠĠ Ġif Ġ( serialized Nodes . contains ( node )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit able . emit ( Alias Event ( t Alias )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserialized Nodes . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( node . nodeType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNode Type . SCAL AR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscalar Node Ġ= Ġnode Ġas ĠScalar Node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdetected Tag Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsettings . scalar Resolver . resolve ( scalar Node . value , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Tag Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsettings . scalar Resolver . resolve ( scalar Node . value , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtuple Ġ= ĠImp licit Tuple ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . tag Ġ== Ġdetected Tag , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . tag Ġ== Ġdefault Tag ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠScalar Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanchor Ġ= Ġt Alias , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= Ġnode . tag . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimplicit Ġ= Ġtuple , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġscalar Node . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscalar Style Ġ= Ġscalar Node . style ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit able . emit ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNode Type . SEQUENCE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseq Node Ġ= Ġnode Ġas ĠSequence Node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimplicit S Ġ= Ġnode . tag Ġ== ĠTag . SEQ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit able . emit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSequence Start Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt Alias , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . tag . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimplicit S , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseq Node . flow Style ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġseq Node . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġlist ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserialize Node ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit able . emit ( Sequence End Event ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimplicit M Ġ= Ġnode . tag . equals ( Tag . MAP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit able . emit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMapping Start Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt Alias , Ġnode . tag . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimplicit M , Ġ( node Ġas ĠCollection Node < *> ). flow Style ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmapping Node Ġ= Ġnode Ġas ĠMapping Node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġmapping Node . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġmap ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġentry . key Node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġentry . value Node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserialize Node ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserialize Node ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit able . emit ( Mapping End Event ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ