diff --git a/.travis.yml b/.travis.yml index c2849ce..d3a45f0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ language: go go: -- "1.14" +- "1.17" env: - GO111MODULE=on diff --git a/README.md b/README.md index 53cb576..62773f9 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,8 @@ To read a JWS from IPFS: ```go import ( - "github.com/alexjg/dagjose" cidlink "github.com/ipld/go-ipld-prime/linking/cid" + "github.com/ceramicnetwork/dagjose" + "github.com/ipld/go-ipld-prime/linking/cid" ) // Here we're creating a `CID` which points to a JWS jwsCid, err := cid.Decode("some cid") diff --git a/dagjose/dagjose.go b/dagjose/dagjose.go deleted file mode 100644 index d9afab8..0000000 --- a/dagjose/dagjose.go +++ /dev/null @@ -1,109 +0,0 @@ -package dagjose - -import ( - "github.com/ipfs/go-cid" - ipld "github.com/ipld/go-ipld-prime" - cidlink "github.com/ipld/go-ipld-prime/linking/cid" -) - -// This is a union of the DagJWE and DagJWS types. Typically you will want to -// use AsJWE and AsJWS to get a concrete JOSE object. -type DagJOSE struct { - // JWS top level keys - payload *cid.Cid - signatures []jwsSignature - // JWE top level keys - protected []byte - unprotected []byte - iv []byte - aad []byte - ciphertext []byte - tag []byte - recipients []jweRecipient -} - -type jwsSignature struct { - protected []byte - header map[string]ipld.Node - signature []byte -} - -type jweRecipient struct { - header map[string]ipld.Node - encrypted_key []byte -} - -func (d *DagJOSE) AsNode() ipld.Node { - return dagJOSENode{d} -} - -// If this jose object is a JWS then this will return a DagJWS, if it is a -// JWE then AsJWS will return nil -func (d *DagJOSE) AsJWS() *DagJWS { - if d.payload != nil { - return &DagJWS{dagjose: d} - } - return nil -} - -// If this jose object is a JWE then this will return a DagJWE, if it is a -// JWS then AsJWE will return nil -func (d *DagJOSE) AsJWE() *DagJWE { - if d.ciphertext != nil { - return &DagJWE{dagjose: d} - } - return nil -} - -type DagJWS struct{ dagjose *DagJOSE } - -// Returns a DagJOSE object that implements ipld.Node and can be passed to -// ipld related infrastructure -func (d *DagJWS) AsJOSE() *DagJOSE { - return d.dagjose -} - -type DagJWE struct{ dagjose *DagJOSE } - -// Returns a DagJOSE object that implements ipld.Node and can be passed to -// ipld related infrastructure -func (d *DagJWE) AsJOSE() *DagJOSE { - return d.dagjose -} - -func (d *DagJWS) PayloadLink() ipld.Link { - return cidlink.Link{Cid: *d.dagjose.payload} -} - -// A link prototype which will build CIDs using the dag-jose multicodec and -// the sha-384 multihash -var LinkPrototype = cidlink.LinkPrototype{Prefix: cid.Prefix{ - Version: 1, // Usually '1'. - Codec: 0x85, // 0x71 means "dag-jose" -- See the multicodecs table: https://github.com/multiformats/multicodec/ - MhType: 0x15, // 0x15 means "sha3-384" -- See the multicodecs table: https://github.com/multiformats/multicodec/ - MhLength: 48, // sha3-224 hash has a 48-byte sum. -}} - -// A convenience function which passes the correct dagjose.LinkProtoype append -// jose.AsNode() to ipld.LinkSystem.Store -func StoreJOSE(linkContext ipld.LinkContext, jose *DagJOSE, linkSystem ipld.LinkSystem) (ipld.Link, error) { - return linkSystem.Store(linkContext, LinkPrototype, jose.AsNode()) -} - -var NodePrototype = &DagJOSENodePrototype{} - -// LoadJOSE is a convenience function which wraps ipld.LinkSystem.Load. This -// will provide the dagjose.NodePrototype to the link system and attempt to -// cast the result to a DagJOSE object -func LoadJOSE(lnk ipld.Link, linkContext ipld.LinkContext, linkSystem ipld.LinkSystem) (*DagJOSE, error) { - n, err := linkSystem.Load( - linkContext, - lnk, - NodePrototype, - ) - if err != nil { - return nil, err - } - - return n.(dagJOSENode).DagJOSE, nil -} diff --git a/dagjose/dagjose_assembler.go b/dagjose/dagjose_assembler.go deleted file mode 100644 index 52c317c..0000000 --- a/dagjose/dagjose_assembler.go +++ /dev/null @@ -1,242 +0,0 @@ -package dagjose - -import ( - "fmt" - - "github.com/ipfs/go-cid" - ipld "github.com/ipld/go-ipld-prime" - basicnode "github.com/ipld/go-ipld-prime/node/basic" - "github.com/ipld/go-ipld-prime/node/mixins" -) - -var ( - _ ipld.Node = dagJOSENode{} - _ ipld.NodePrototype = &DagJOSENodePrototype{} - _ ipld.NodeAssembler = &dagJOSENodeBuilder{} -) - -type DagJOSENodePrototype struct{} - -func (d *DagJOSENodePrototype) NewBuilder() ipld.NodeBuilder { - return &dagJOSENodeBuilder{dagJose: DagJOSE{}} -} - -// Returns an instance of the DagJOSENodeBuilder which can be passed to -// ipld.Link.Load and will build a dagjose.DagJOSE object. This should only be -// neccesary in reasonably advanced situations, most of the time you should be -// able to use dagjose.LoadJOSE -func NewBuilder() ipld.NodeBuilder { - return &dagJOSENodeBuilder{dagJose: DagJOSE{}} -} - -type maState uint8 - -const ( - maState_initial maState = iota // also the 'expect key or finish' state - maState_midKey // waiting for a 'finished' state in the KeyAssembler. - maState_expectValue // 'AssembleValue' is the only valid next step - maState_midValue // waiting for a 'finished' state in the ValueAssembler. - maState_finished // finised -) - -// An implementation of `ipld.NodeBuilder` which builds a `dagjose.DagJOSE` -// object. This builder will throw an error if the IPLD data it is building -// does not match the schema specified in the spec -type dagJOSENodeBuilder struct { - dagJose DagJOSE - state maState - key *string -} - -var dagJoseMixin = mixins.MapAssembler{TypeName: "dagjose"} - -func (d *dagJOSENodeBuilder) BeginMap(sizeHint int64) (ipld.MapAssembler, error) { - if d.state != maState_initial { - panic("misuse") - } - return d, nil -} -func (d *dagJOSENodeBuilder) BeginList(sizeHint int64) (ipld.ListAssembler, error) { - if d.state == maState_midValue && *d.key == "recipients" { - d.dagJose.recipients = make([]jweRecipient, 0, sizeHint) - d.state = maState_initial - return &jweRecipientListAssembler{&d.dagJose}, nil - } - if d.state == maState_midValue && *d.key == "signatures" { - d.dagJose.signatures = make([]jwsSignature, 0, sizeHint) - d.state = maState_initial - return &jwsSignatureListAssembler{&d.dagJose}, nil - } - return dagJoseMixin.BeginList(sizeHint) -} -func (d *dagJOSENodeBuilder) AssignNull() error { - if d.state == maState_midValue { - switch *d.key { - case "payload": - d.dagJose.payload = nil - case "protected": - d.dagJose.protected = nil - case "unprotected": - d.dagJose.unprotected = nil - case "iv": - d.dagJose.iv = nil - case "aad": - d.dagJose.aad = nil - case "ciphertext": - d.dagJose.ciphertext = nil - case "tag": - d.dagJose.tag = nil - case "signatures": - d.dagJose.signatures = nil - case "recipients": - d.dagJose.recipients = nil - default: - panic("should not happen due to AssignString implementation") - } - d.state = maState_initial - return nil - } - return dagJoseMixin.AssignNull() -} -func (d *dagJOSENodeBuilder) AssignBool(b bool) error { - return dagJoseMixin.AssignBool(b) -} -func (d *dagJOSENodeBuilder) AssignInt(i int64) error { - return dagJoseMixin.AssignInt(i) -} -func (d *dagJOSENodeBuilder) AssignFloat(f float64) error { - return dagJoseMixin.AssignFloat(f) -} -func (d *dagJOSENodeBuilder) AssignString(s string) error { - if d.state == maState_midKey { - if !isValidJOSEKey(s) { - return fmt.Errorf("Attempted to assign an invalid JOSE key: %v", s) - } - d.key = &s - d.state = maState_expectValue - return nil - } - return dagJoseMixin.AssignString(s) -} -func (d *dagJOSENodeBuilder) AssignBytes(b []byte) error { - if d.state == maState_midValue { - switch *d.key { - case "payload": - _, cid, err := cid.CidFromBytes(b) - if err != nil { - return fmt.Errorf("payload is not a valid CID: %v", err) - } - d.dagJose.payload = &cid - case "protected": - d.dagJose.protected = b - case "unprotected": - d.dagJose.unprotected = b - case "iv": - d.dagJose.iv = b - case "aad": - d.dagJose.aad = b - case "ciphertext": - d.dagJose.ciphertext = b - case "tag": - d.dagJose.tag = b - case "signatures": - return fmt.Errorf("attempted to assign bytes to 'signatures' key") - case "recipients": - return fmt.Errorf("attempted to assign bytes to 'recipients' key") - default: - panic("should not happen due to AssignString implementation") - } - d.state = maState_initial - return nil - } - return dagJoseMixin.AssignBytes(b) -} -func (d *dagJOSENodeBuilder) AssignLink(l ipld.Link) error { - return dagJoseMixin.AssignLink(l) -} -func (d *dagJOSENodeBuilder) AssignNode(n ipld.Node) error { - if d.state != maState_initial { - panic("misuse") - } - if n.Kind() != ipld.Kind_Map { - return ipld.ErrWrongKind{TypeName: "map", MethodName: "AssignNode", AppropriateKind: ipld.KindSet_JustMap, ActualKind: n.Kind()} - } - itr := n.MapIterator() - for !itr.Done() { - k, v, err := itr.Next() - if err != nil { - return err - } - if err := d.AssembleKey().AssignNode(k); err != nil { - return err - } - if err := d.AssembleValue().AssignNode(v); err != nil { - return err - } - } - return d.Finish() -} -func (d *dagJOSENodeBuilder) Prototype() ipld.NodePrototype { - return &DagJOSENodePrototype{} -} -func (d *dagJOSENodeBuilder) Build() ipld.Node { - return dagJOSENode{&d.dagJose} -} -func (d *dagJOSENodeBuilder) Reset() { -} - -func (d *dagJOSENodeBuilder) AssembleKey() ipld.NodeAssembler { - if d.state != maState_initial { - panic("misuse") - } - d.state = maState_midKey - return d -} -func (d *dagJOSENodeBuilder) AssembleValue() ipld.NodeAssembler { - if d.state != maState_expectValue { - panic("misuse") - } - d.state = maState_midValue - return d -} -func (d *dagJOSENodeBuilder) AssembleEntry(k string) (ipld.NodeAssembler, error) { - if d.state != maState_initial { - panic("misuse") - } - d.key = &k - d.state = maState_midValue - return d, nil -} -func (d *dagJOSENodeBuilder) Finish() error { - if d.state != maState_initial { - panic("misuse") - } - d.state = maState_finished - return nil -} -func (d *dagJOSENodeBuilder) KeyPrototype() ipld.NodePrototype { - return basicnode.Prototype.String -} -func (d *dagJOSENodeBuilder) ValuePrototype(k string) ipld.NodePrototype { - return basicnode.Prototype.Any -} - -func isValidJOSEKey(key string) bool { - allowedKeys := []string{ - "payload", - "signatures", - "protected", - "unprotected", - "iv", - "aad", - "ciphertext", - "tag", - "recipients", - } - for _, allowedKey := range allowedKeys { - if key == allowedKey { - return true - } - } - return false -} diff --git a/dagjose/dagjose_test.go b/dagjose/dagjose_test.go deleted file mode 100644 index 08d9d92..0000000 --- a/dagjose/dagjose_test.go +++ /dev/null @@ -1,634 +0,0 @@ -package dagjose - -import ( - "bytes" - "fmt" - "io" - "sort" - "testing" - - "github.com/ipfs/go-cid" - "github.com/ipld/go-ipld-prime" - "github.com/ipld/go-ipld-prime/fluent" - cidlink "github.com/ipld/go-ipld-prime/linking/cid" - basicnode "github.com/ipld/go-ipld-prime/node/basic" - "github.com/multiformats/go-multihash" - "github.com/stretchr/testify/require" - "golang.org/x/crypto/ed25519" - gojose "gopkg.in/square/go-jose.v2" - "pgregory.net/rapid" -) - -// This test suite is mostly a set of property based tests for the serialization -// of JOSE objects to and from IPLD and JSON. Serialization is well suited to -// property based testing as we have the very straightforward property that -// serializing followed by deserialization should be the same as the identity -// function. -// -// In order to test this property we use the `rapid` property testing library. -// We start by defining a series of generators, which we use to generate arbitrary -// JOSE objects - -// Generate an arbitrary CID -func cidGen() *rapid.Generator { - return rapid.Custom(func(t *rapid.T) *cid.Cid { - data := rapid.SliceOfN(rapid.Byte(), 10, 100).Draw(t, "cid data bytes").([]byte) - mh, err := multihash.Sum(data, multihash.SHA3_384, 48) - if err != nil { - panic(err) - } - result := cid.NewCidV1(cid.Raw, mh) - return &result - }) -} - -// An arbitrary ed25519 private key -func ed25519PrivateKeyGen() *rapid.Generator { - return rapid.Custom(func(t *rapid.T) ed25519.PrivateKey { - seedBytes := rapid.ArrayOf(ed25519.SeedSize, rapid.Byte()).Draw(t, "private key bytes").([ed25519.SeedSize]byte) - return ed25519.NewKeyFromSeed(seedBytes[:]) - }) -} - -// Reppresents a JWS which has been signed and the private key used to sign it -type ValidJWS struct { - dagJose *DagJWS - key ed25519.PrivateKey -} - -// Generate a signed JWS along with the private key used to sign it -func validJWSGen() *rapid.Generator { - return rapid.Custom(func(t *rapid.T) ValidJWS { - link := cidGen().Draw(t, "Valid DagJOSE payload").(*cid.Cid) - privateKey := ed25519PrivateKeyGen().Draw(t, "valid jws private key").(ed25519.PrivateKey) - - signer, err := gojose.NewSigner(gojose.SigningKey{ - Algorithm: gojose.EdDSA, - Key: privateKey, - }, nil) - if err != nil { - panic(fmt.Errorf("error creating signer for ValidJWS: %v", err)) - } - gojoseJws, err := signer.Sign(link.Bytes()) - if err != nil { - panic(fmt.Errorf("Error signing ValidJWS: %v", err)) - } - dagJose, err := ParseJWS([]byte(gojoseJws.FullSerialize())) - if err != nil { - panic(fmt.Errorf("error creating dagjose: %v", err)) - } - return ValidJWS{ - dagJose: dagJose, - key: privateKey, - } - }) -} - -// Generate a non-empty slice of JWSSignatures. Note that the signatures are -// not valid, they are just arbitrary byte sequences. -func sliceOfSignatures() *rapid.Generator { - return rapid.Custom(func(t *rapid.T) []jwsSignature { - return rapid.SliceOf(signatureGen()).Filter(func(sigs interface{}) bool { - return len(sigs.([]jwsSignature)) > 0 - }).Draw(t, "A non empty slice of signatures").([]jwsSignature) - }) -} - -// Generate a non empty slice of JWERecipients -func sliceOfRecipients() *rapid.Generator { - return rapid.Custom(func(t *rapid.T) []jweRecipient { - return rapid.SliceOf(recipientGen()).Filter(func(recipients interface{}) bool { - return len(recipients.([]jweRecipient)) > 0 - }).Draw(t, "A nillable slice of signatures").([]jweRecipient) - }) -} - -// Generate a slice of bytes, the slice may be nil -func sliceOfBytes() *rapid.Generator { - return rapid.Custom(func(t *rapid.T) []byte { - isNil := rapid.Bool().Draw(t, "").(bool) - if isNil { - return nil - } - return rapid.SliceOf(rapid.Byte()).Draw(t, "A nillable slice of bytes").([]byte) - }) -} - -// Generate a non nilable slice of bytes -func nonNilSliceOfBytes() *rapid.Generator { - return rapid.Custom(func(t *rapid.T) []byte { - return rapid.SliceOf(rapid.Byte()).Draw(t, "A slice of bytes").([]byte) - }) -} - -// Below are a series of generators for ipld.Node's. This is required because -// the unprotected headers of both JWE and JWS objects can contain arbitrary -// JSON, which we translate into basicnode objects - -func ipldStringGen() *rapid.Generator { - return rapid.Custom(func(t *rapid.T) ipld.Node { - return basicnode.NewString(rapid.String().Draw(t, "an IPLD string").(string)) - }) -} - -func ipldFloatGen() *rapid.Generator { - return rapid.Custom(func(t *rapid.T) ipld.Node { - return basicnode.NewFloat(rapid.Float64().Draw(t, "an IPLD float").(float64)) - }) -} - -func ipldIntGen() *rapid.Generator { - return rapid.Custom(func(t *rapid.T) ipld.Node { - return basicnode.NewInt(rapid.Int64().Draw(t, "an IPLD integer").(int64)) - }) -} - -func ipldNullGen() *rapid.Generator { - return rapid.Just(ipld.Null) -} - -func ipldBoolGen() *rapid.Generator { - return rapid.Custom(func(t *rapid.T) ipld.Node { - return basicnode.NewBool(rapid.Bool().Draw(t, "an IPLD bool").(bool)) - }) -} - -func ipldBytesGen() *rapid.Generator { - return rapid.Custom(func(t *rapid.T) ipld.Node { - return basicnode.NewBytes(rapid.SliceOf(rapid.Byte()).Draw(t, "some IPLD Bytes").([]byte)) - }) -} - -// Generate a list of arbitrary ipld.Node, the depth parameter is decreased by one -// and passed to the generator of the child nodes. -func ipldListGen(depth int) *rapid.Generator { - return rapid.Custom(func(t *rapid.T) ipld.Node { - elems := rapid.SliceOf(ipldNodeGen(depth-1)).Draw(t, "elements of an IPLD list").([]ipld.Node) - return fluent.MustBuildList( - basicnode.Prototype.List, - int64(len(elems)), - func(la fluent.ListAssembler) { - for _, elem := range elems { - la.AssembleValue().AssignNode(elem) - } - }, - ) - }) -} - -// Generate a map of arbitrary ipld Nodes, the depth parameter is decreased by -// one and passed to the generator of child nodes. -func ipldMapGen(depth int) *rapid.Generator { - return rapid.Custom(func(t *rapid.T) ipld.Node { - keys := rapid.SliceOfDistinct( - rapid.String(), - func(k string) string { - return k - }, - ).Draw(t, "IPLD map keys").([]string) - return fluent.MustBuildMap( - basicnode.Prototype.Map, - int64(len(keys)), - func(ma fluent.MapAssembler) { - for _, key := range keys { - value := ipldNodeGen(depth-1).Draw(t, "an IPLD map value").(ipld.Node) - ma.AssembleEntry(key).AssignNode(value) - } - }, - ) - }) -} - -// Generate a map of ipld nodes with string keys. This is used for the top -// level of the unprotected header of JOSE objects. -func stringKeyedIPLDMapGen(depth int) *rapid.Generator { - return rapid.Custom(func(t *rapid.T) map[string]ipld.Node { - isNil := rapid.Bool().Draw(t, "whether the map is nil").(bool) - if isNil { - return nil - } - keys := rapid.SliceOf(rapid.String()).Draw(t, "IPLD map keys").([]string) - result := make(map[string]ipld.Node) - for _, key := range keys { - value := ipldNodeGen(depth-1).Draw(t, "an IPLD map value").(ipld.Node) - result[key] = value - } - return result - }) -} - -// Generate an arbitrary IPLD node. The depth parameter is used to determine -// the maximum depth of recursive data types (map and list) generated by this -// generator. -func ipldNodeGen(depth int) *rapid.Generator { - return rapid.Custom(func(t *rapid.T) ipld.Node { - elems := []*rapid.Generator{ - ipldStringGen(), - ipldIntGen(), - ipldFloatGen(), - ipldNullGen(), - ipldBoolGen(), - } - if depth > 0 { - elems = append(elems, ipldListGen(depth), ipldMapGen(depth)) - } - return rapid.OneOf( - elems..., - ).Draw(t, "an IPLD node").(ipld.Node) - }) -} - -// Generate an arbitrary JWSSignature, note that the signature is not valid -func signatureGen() *rapid.Generator { - return rapid.Custom(func(t *rapid.T) jwsSignature { - return jwsSignature{ - protected: sliceOfBytes().Draw(t, "signature protected bytes").([]byte), - header: stringKeyedIPLDMapGen(4).Draw(t, "signature header").(map[string]ipld.Node), - signature: nonNilSliceOfBytes().Draw(t, "signature bytes").([]byte), - } - }) -} - -// Generate an arbitrary JWERecipient -func recipientGen() *rapid.Generator { - return rapid.Custom(func(t *rapid.T) jweRecipient { - return jweRecipient{ - header: stringKeyedIPLDMapGen(4).Draw(t, "recipient header").(map[string]ipld.Node), - encrypted_key: sliceOfBytes().Draw(t, "recipient encrypted key").([]byte), - } - }).Filter(func(recipient jweRecipient) bool { - return recipient.encrypted_key != nil || recipient.header != nil - }) -} - -// Generate an arbitrary JWS, note that the signatures will not be valid -func jwsGen() *rapid.Generator { - return rapid.Custom(func(t *rapid.T) *DagJWS { - return (&DagJOSE{ - payload: cidGen().Draw(t, "a JWS CID").(*cid.Cid), - signatures: sliceOfSignatures().Draw(t, "jose signatures").([]jwsSignature), - }).AsJWS() - }) -} - -// Generate an arbitrary JWE, note that the ciphertext is just random bytes and -// cannot be decrypted to anything -func jweGen() *rapid.Generator { - return rapid.Custom(func(t *rapid.T) *DagJWE { - return (&DagJOSE{ - protected: sliceOfBytes().Draw(t, "jose protected").([]byte), - unprotected: sliceOfBytes().Draw(t, "jose unprotected").([]byte), - iv: sliceOfBytes().Draw(t, "JOSE iv").([]byte), - aad: sliceOfBytes().Draw(t, "JOSE iv").([]byte), - ciphertext: nonNilSliceOfBytes().Draw(t, "JOSE iv").([]byte), - tag: sliceOfBytes().Draw(t, "JOSE iv").([]byte), - recipients: sliceOfRecipients().Draw(t, "JOSE recipients").([]jweRecipient), - }).AsJWE() - }) -} - -// Generate an arbitrary JOSE object, i.e either a JWE or a JWS -func arbitraryJoseGen() *rapid.Generator { - return rapid.Custom(func(t *rapid.T) *DagJOSE { - isJwe := rapid.Bool().Draw(t, "whether this jose is a jwe").(bool) - if isJwe { - return jweGen().Draw(t, "an arbitrary JWE").(*DagJWE).AsJOSE() - } else { - return jwsGen().Draw(t, "an arbitrary JWS").(*DagJWS).AsJOSE() - } - }) -} - -// Generate a JWS with only one signature -func singleSigJWSGen() *rapid.Generator { - return rapid.Custom(func(t *rapid.T) *DagJWS { - return (&DagJOSE{ - payload: cidGen().Draw(t, "a JWS CID").(*cid.Cid), - signatures: []jwsSignature{ - signatureGen().Draw(t, "").(jwsSignature), - }, - }).AsJWS() - }) -} - -// Genreate a JWE with only one recipient -func singleRecipientJWEGen() *rapid.Generator { - return rapid.Custom(func(t *rapid.T) *DagJWE { - return (&DagJOSE{ - protected: sliceOfBytes().Draw(t, "jose protected").([]byte), - unprotected: sliceOfBytes().Draw(t, "jose unprotected").([]byte), - iv: sliceOfBytes().Draw(t, "JOSE iv").([]byte), - aad: sliceOfBytes().Draw(t, "JOSE iv").([]byte), - ciphertext: nonNilSliceOfBytes().Draw(t, "JOSE iv").([]byte), - tag: sliceOfBytes().Draw(t, "JOSE iv").([]byte), - recipients: []jweRecipient{recipientGen().Draw(t, "JWE recipient").(jweRecipient)}, - }).AsJWE() - }) -} - -// Normalize json values contained in the unprotected headers of signatures -// and recipients -// -// Unprotected headers can contain arbitrary JSON. There are two things we have -// to normalise for comparison in tests: -// - Integer values will end up as float values after serialization -> deserialization -// so we convert all integer values to floats -// - Maps don't have a defined order in JSON, so we modify all maps so that -// they are ordered by key -func normalizeJoseForJsonComparison(d *DagJOSE) { - for _, recipient := range d.recipients { - for key, value := range recipient.header { - recipient.header[key] = normalizeIpldNode(value) - } - } - for _, sig := range d.signatures { - for key, value := range sig.header { - sig.header[key] = normalizeIpldNode(value) - } - } -} - -// This is used by the `normalizeJoseForJsonComparison` function to normalize -// the arbitrary IPLD structures in the headers of JWE and JWS objects -func normalizeIpldNode(n ipld.Node) ipld.Node { - switch n.Kind() { - case ipld.Kind_Int: - asInt, err := n.AsInt() - if err != nil { - panic(fmt.Errorf("normalizeIpldNode error calling AsInt: %v", err)) - } - return basicnode.NewFloat(float64(asInt)) - case ipld.Kind_Map: - mapIterator := n.MapIterator() - if mapIterator == nil { - panic(fmt.Errorf("normalizeIpldNode nil MapIterator returned from map node")) - } - // For a map we normalize such that the map keys are in sorted order, - // this order is maintained by the basicnode.Map implementation - return fluent.MustBuildMap( - n.Prototype(), - 0, - func(ma fluent.MapAssembler) { - type kv struct { - key string - value ipld.Node - } - kvs := make([]kv, 0) - for !mapIterator.Done() { - key, val, err := mapIterator.Next() - if err != nil { - panic(fmt.Errorf("normalizeIpldNode error calling Next on mapiterator: %v", err)) - } - keyString, err := key.AsString() - if err != nil { - panic(fmt.Errorf("normalizeIpldNode: error converting key to string: %v", err)) - } - kvs = append(kvs, kv{key: keyString, value: normalizeIpldNode(val)}) - } - sort.SliceStable(kvs, func(i int, j int) bool { - return kvs[i].key < kvs[j].key - }) - for _, kv := range kvs { - ma.AssembleKey().AssignString(kv.key) - ma.AssembleValue().AssignNode(kv.value) - } - }, - ) - case ipld.Kind_List: - listIterator := n.ListIterator() - if listIterator == nil { - panic(fmt.Errorf("convertIntNodesToFlaot nil ListIterator returned from list node")) - } - return fluent.MustBuildList( - n.Prototype(), - 0, - func(la fluent.ListAssembler) { - for !listIterator.Done() { - _, val, err := listIterator.Next() - if err != nil { - panic(fmt.Errorf("convertIntNodesToFlaot error calling Next on listiterator: %v", err)) - } - la.AssembleValue().AssignNode(normalizeIpldNode(val)) - } - }, - ) - default: - return n - } -} - -// Given a JOSE object we encode it using BuildJOSELink and decode it using LoadJOSE and return the result -func roundTripJose(j *DagJOSE) *DagJOSE { - buf := bytes.Buffer{} - ls := cidlink.DefaultLinkSystem() - ls.StorageWriteOpener = func(lnkCtx ipld.LinkContext) (io.Writer, ipld.BlockWriteCommitter, error) { - return &buf, func(lnk ipld.Link) error { return nil }, nil - } - ls.StorageReadOpener = func(lnkCtx ipld.LinkContext, lnk ipld.Link) (io.Reader, error) { - return bytes.NewReader(buf.Bytes()), nil - } - - link, err := StoreJOSE( - ipld.LinkContext{}, - j, - ls, - ) - if err != nil { - panic(fmt.Errorf("error storing DagJOSE: %v", err)) - } - jose, err := LoadJOSE( - link, - ipld.LinkContext{}, - ls, - ) - if err != nil { - panic(fmt.Errorf("error reading data from datastore: %v", err)) - } - return jose -} - -// Check that if we encode and decode a valid JWS object then the -// output is equal to the input (up to ipld normalization) -func TestRoundTripValidJWS(t *testing.T) { - rapid.Check(t, func(t *rapid.T) { - validJws := validJWSGen().Draw(t, "valid JWS").(ValidJWS) - roundTripped := roundTripJose(validJws.dagJose.AsJOSE()).AsJWS() - require.Equal(t, validJws.dagJose, roundTripped) - }) -} - -// Check that if we encode and decode an arbitrary JOSE object then the -// output is equal to the input (up to ipld normalization) -func TestRoundTripArbitraryJOSE(t *testing.T) { - rapid.Check(t, func(t *rapid.T) { - jose := arbitraryJoseGen().Draw(t, "An arbitrary JOSE object").(*DagJOSE) - roundTripped := roundTripJose(jose) - normalizeJoseForJsonComparison(jose) - normalizeJoseForJsonComparison(roundTripped) - require.Equal(t, jose, roundTripped) - }) -} - -// Decoding should always return either a JWS or a JWE if the input is valid -func TestAlwaysDeserializesToEitherJWSOrJWE(t *testing.T) { - rapid.Check(t, func(t *rapid.T) { - jose := arbitraryJoseGen().Draw(t, "An arbitrary JOSE object").(*DagJOSE) - roundTripped := roundTripJose(jose) - if roundTripped.AsJWE() == nil { - require.NotNil(t, roundTripped.AsJWS()) - } - }) -} - -// If we parse the JSON serialization of a JWS then the output should equal -// the input -func TestJSONSerializationJWS(t *testing.T) { - rapid.Check(t, func(t *rapid.T) { - dagJws := jwsGen().Draw(t, "An arbitrary JWS").(*DagJWS) - generalSerialization := dagJws.GeneralJSONSerialization() - parsedJose, err := ParseJWS(generalSerialization) - normalizeJoseForJsonComparison(dagJws.AsJOSE()) - if err != nil { - t.Errorf("error parsing full serialization: %v", err) - } - require.Equal(t, dagJws, parsedJose) - }) -} - -// If we parse the JSON serialization of a JWE then the output should equal -// the input -func TestJSONSerializationJWE(t *testing.T) { - rapid.Check(t, func(t *rapid.T) { - dagJwe := jweGen().Draw(t, "An arbitrary JOSE object").(*DagJWE) - generalSerialization := dagJwe.GeneralJSONSerialization() - parsedJose, err := ParseJWE(generalSerialization) - normalizeJoseForJsonComparison(dagJwe.AsJOSE()) - if err != nil { - t.Errorf("error parsing full serialization: %v", err) - } - require.Equal(t, dagJwe, parsedJose) - }) -} - -// A JWS without a signature is not valid -func TestMissingPayloadErrorParsingJWS(t *testing.T) { - jsonStr := "{\"signatures\": []}" - jws, err := ParseJWS([]byte(jsonStr)) - require.NotNil(t, err) - require.Nil(t, jws) -} - -// A JWE without ciphertext is not valid -func TestMissingCiphertextErrorParsingJWE(t *testing.T) { - jsonStr := "{\"header\": {}}" - jwe, err := ParseJWE([]byte(jsonStr)) - require.NotNil(t, err) - require.Nil(t, jwe) -} - -// If we parse the flattened serialization of a JWS then the input should -// equal the output -func TestFlattenedSerializationJWS(t *testing.T) { - rapid.Check(t, func(t *rapid.T) { - jws := singleSigJWSGen().Draw(t, "a JWS").(*DagJWS) - flattenedSerialization, err := jws.FlattenedSerialization() - if err != nil { - t.Errorf("error creating flattened serialization: %v", err) - return - } - parsedJose, err := ParseJWS([]byte(flattenedSerialization)) - if err != nil { - t.Errorf("error parsing flattenedSerialization: %v", err) - return - } - normalizeJoseForJsonComparison(jws.AsJOSE()) - require.Equal(t, jws, parsedJose) - }) -} - -// Trying to serialize a JWS with more than one signature to a flattened -// serialization should throw an error -func TestFlattenedJWSErrorIfSignatureAndSignaturesDefined(t *testing.T) { - jsonStr := "{\"signature\": \"\", \"signatures\": [], \"payload\": \"\"}" - jws, err := ParseJWS([]byte(jsonStr)) - require.NotNil(t, err) - require.Contains(t, err.Error(), "cannot contain both a 'signature' and a 'signatures'") - require.Nil(t, jws) -} - -// If we parse the flattened serialization of a JWE then the input should -// equal the output -func TestFlattenedSerializationJWE(t *testing.T) { - rapid.Check(t, func(t *rapid.T) { - jwe := singleRecipientJWEGen().Draw(t, "a JWE with one recipient").(*DagJWE) - flattenedSerialization, err := jwe.FlattenedSerialization() - if err != nil { - t.Errorf("error creating flattened serialization: %v", err) - return - } - parsedJose, err := ParseJWE([]byte(flattenedSerialization)) - if err != nil { - t.Errorf("error parsing flattenedSerialization: %v", err) - return - } - normalizeJoseForJsonComparison(jwe.AsJOSE()) - require.Equal(t, jwe, parsedJose) - }) -} - -// If the incoming IPLD data contains a payload which is not a valid CID we -// should raise an error -func TestLoadingJWSWithNonCIDPayloadReturnsError(t *testing.T) { - rapid.Check(t, func(t *rapid.T) { - payload := nonNilSliceOfBytes().Filter(func(payloadBytes []byte) bool { - _, _, err := cid.CidFromBytes(payloadBytes) - return err != nil - }).Draw(t, "A slice of bytes which is not a valid CID").([]byte) - node := fluent.MustBuildMap( - basicnode.Prototype.Map, - 2, - func(ma fluent.MapAssembler) { - ma.AssembleEntry("payload").AssignBytes(payload) - }, - ) - buf := bytes.Buffer{} - ls := cidlink.DefaultLinkSystem() - ls.StorageWriteOpener = func(lnkCtx ipld.LinkContext) (io.Writer, ipld.BlockWriteCommitter, error) { - return &buf, func(lnk ipld.Link) error { return nil }, nil - } - ls.StorageReadOpener = func(lnkCtx ipld.LinkContext, lnk ipld.Link) (io.Reader, error) { - return bytes.NewReader(buf.Bytes()), nil - } - link, err := ls.Store( - ipld.LinkContext{}, - LinkPrototype, - node, - ) - if err != nil { - t.Errorf("Error creating link to invalid payload node: %v", err) - return - } - _, err = LoadJOSE( - link, - ipld.LinkContext{}, - ls, - ) - require.NotNil(t, err) - require.Contains(t, err.Error(), "payload is not a valid CID") - }) -} - -// Trying to serialize a JWE with more than one recipient to a flattened -// serialization should throw an error -func TestFlattenedJWEErrorIfEncryptedKeyOrHeaderAndRecipientsDefined(t *testing.T) { - scenarios := [][]byte{ - []byte("{\"ciphertext\": \"\", \"encrypted_key\": \"\", \"recipients\": []}"), - []byte("{\"ciphertext\": \"\", \"header\": {}, \"recipients\": []}"), - } - for _, scenario := range scenarios { - jwe, err := ParseJWE(scenario) - require.NotNil(t, err) - require.Contains(t, err.Error(), "cannot contain 'recipients' and either 'encrypted_key' or 'header'") - require.Nil(t, jwe) - } -} diff --git a/dagjose/doc.go b/dagjose/doc.go index b8dd927..bf319d7 100644 --- a/dagjose/doc.go +++ b/dagjose/doc.go @@ -4,12 +4,12 @@ // encoding of the general serialization of either a JWE or a JWS. In order to // access this information using go-ipld-prime we need two things: // -// * We need to register an encoder and a encoder which will be used by the cidlink package to decode the raw data into the IPLD data model +// * We need to register an encoder and a decoder which will be used by the cidlink package to decode the raw data into the IPLD data model // // * An implementation of ipld.NodeAssembler which knows how to interpret the IPLD data into some concrete go data type which implements ipld.Node // // The first of these points is handled by importing this package. There is a side -// effecting operation in the module initialiation which registers the encoder +// effecting operation in the module initialization which registers the encoder // and decoder with go-ipld-prime. // // The latter point is provided by the dagjose.DagJOSE data type. This type diff --git a/dagjose/doc_test.go b/dagjose/doc_test.go deleted file mode 100644 index 90e0020..0000000 --- a/dagjose/doc_test.go +++ /dev/null @@ -1,54 +0,0 @@ -package dagjose_test - -import ( - "fmt" - - "github.com/alexjg/go-dag-jose/dagjose" - "github.com/ipfs/go-cid" - ipld "github.com/ipld/go-ipld-prime" - cidlink "github.com/ipld/go-ipld-prime/linking/cid" -) - -func Example_read() { - // Here we're creating a `CID` which points to a JWS - jwsCid, err := cid.Decode("some cid") - if err != nil { - panic(err) - } - // cidlink.Link is an implementation of `ipld.Link` backed by a CID - jwsLnk := cidlink.Link{Cid: jwsCid} - - ls := cidlink.DefaultLinkSystem() - - jose, err := dagjose.LoadJOSE( - jwsLnk, - ipld.LinkContext{}, - ls, //, - ) - if err != nil { - panic(err) - } - if jose.AsJWS() != nil { - // We have a JWS object, print the general serialization of it - print(jose.AsJWS().GeneralJSONSerialization()) - } else { - print("This is not a JWS") - } -} - -func Example_write() { - dagJws, err := dagjose.ParseJWS([]byte("")) - if err != nil { - panic(err) - } - ls := cidlink.DefaultLinkSystem() - link, err := dagjose.StoreJOSE( - ipld.LinkContext{}, - dagJws.AsJOSE(), - ls, - ) - if err != nil { - panic(err) - } - fmt.Printf("Link is: %v", link) -} diff --git a/dagjose/gen/gen.go b/dagjose/gen/gen.go new file mode 100644 index 0000000..c173fe5 --- /dev/null +++ b/dagjose/gen/gen.go @@ -0,0 +1,144 @@ +package main + +import ( + "fmt" + "os" + + "github.com/ipld/go-ipld-prime/datamodel" + "github.com/ipld/go-ipld-prime/schema" + gengo "github.com/ipld/go-ipld-prime/schema/gen/go" +) + +func main() { + ts := schema.TypeSystem{} + ts.Init() + + // -- Common types --> + + ts.Accumulate(schema.SpawnString("String")) + ts.Accumulate(schema.SpawnBytes("Bytes")) + ts.Accumulate(schema.SpawnInt("Int")) + ts.Accumulate(schema.SpawnFloat("Float")) + ts.Accumulate(schema.SpawnLink("Link")) + ts.Accumulate(schema.SpawnMap("Map", "String", "Any", false)) + ts.Accumulate(schema.SpawnList("List", "Any", false)) + + // The `Any` union represents a wildcard nested type that can contain any type of scalar or recursive information + // including itself (as map values or list elements). + ts.Accumulate(schema.SpawnUnion("Any", + []schema.TypeName{ + "String", + "Bytes", + "Int", + "Float", + "Map", + "List", + }, + schema.SpawnUnionRepresentationKinded(map[datamodel.Kind]schema.TypeName{ + datamodel.Kind_String: "String", + datamodel.Kind_Bytes: "Bytes", + datamodel.Kind_Int: "Int", + datamodel.Kind_Float: "Float", + datamodel.Kind_Map: "Map", + datamodel.Kind_List: "List", + }), + )) + + // -- Decode types --> + + // While `Base64Url` is a `String` type and generated through the schema, it has some (surgical) modifications that + // allow it to be treated as a base64url-encoded string "lens" looking at raw, un-encoded bytes being decoded. + ts.Accumulate(schema.SpawnString("Base64Url")) + + // JWS + ts.Accumulate(schema.SpawnStruct("DecodedSignature", []schema.StructField{ + schema.SpawnStructField("header", "Any", true, false), + schema.SpawnStructField("protected", "Base64Url", true, false), + schema.SpawnStructField("signature", "Base64Url", false, false), + }, schema.SpawnStructRepresentationMap(nil))) + + ts.Accumulate(schema.SpawnList("DecodedSignatures", "DecodedSignature", false)) + + // JWE + ts.Accumulate(schema.SpawnStruct("DecodedRecipient", []schema.StructField{ + schema.SpawnStructField("header", "Any", true, false), + schema.SpawnStructField("encrypted_key", "Base64Url", true, false), + }, schema.SpawnStructRepresentationMap(nil))) + + ts.Accumulate(schema.SpawnList("DecodedRecipients", "DecodedRecipient", false)) + + // JOSE + ts.Accumulate(schema.SpawnStruct("DecodedJOSE", []schema.StructField{ + schema.SpawnStructField("aad", "Base64Url", true, false), + schema.SpawnStructField("ciphertext", "Base64Url", true, false), + schema.SpawnStructField("iv", "Base64Url", true, false), + + // `link` is not encoded as part of DAG-JOSE because it is not included in the DAG-JOSE spec but is included + // here in the schema because it is required when decoding/encoding from/to other encodings (e.g. DAG-JSON). + // If `payload` is present during decode, `link` is added with contents matching `payload`. If `link` is present + // during encode, it is validated against `payload` and then ignored. + schema.SpawnStructField("link", "Link", true, false), + + schema.SpawnStructField("payload", "Base64Url", true, false), + schema.SpawnStructField("protected", "Base64Url", true, false), + schema.SpawnStructField("recipients", "DecodedRecipients", true, false), + schema.SpawnStructField("signatures", "DecodedSignatures", true, false), + schema.SpawnStructField("tag", "Base64Url", true, false), + schema.SpawnStructField("unprotected", "Any", true, false), + }, schema.SpawnStructRepresentationMap(nil))) + + // -- Encode types --> + + // While `Raw` is a `Bytes` type and generated through the schema, it has some (surgical) modifications that allow + // it to be treated as a raw, un-encoded bytes "lens" looking at base64url-encoded strings being encoded. + ts.Accumulate(schema.SpawnBytes("Raw")) + + // JWS + ts.Accumulate(schema.SpawnStruct("EncodedSignature", []schema.StructField{ + schema.SpawnStructField("header", "Any", true, false), + schema.SpawnStructField("protected", "Raw", true, false), + schema.SpawnStructField("signature", "Raw", false, false), + }, schema.SpawnStructRepresentationMap(nil))) + + ts.Accumulate(schema.SpawnList("EncodedSignatures", "EncodedSignature", false)) + + // JWE + ts.Accumulate(schema.SpawnStruct("EncodedRecipient", []schema.StructField{ + schema.SpawnStructField("header", "Any", true, false), + schema.SpawnStructField("encrypted_key", "Raw", true, false), + }, schema.SpawnStructRepresentationMap(nil))) + + ts.Accumulate(schema.SpawnList("EncodedRecipients", "EncodedRecipient", false)) + + // JOSE + ts.Accumulate(schema.SpawnStruct("EncodedJOSE", []schema.StructField{ + schema.SpawnStructField("aad", "Raw", true, false), + schema.SpawnStructField("ciphertext", "Raw", true, false), + schema.SpawnStructField("iv", "Raw", true, false), + + // `link` is not encoded as part of DAG-JOSE because it is not included in the DAG-JOSE spec but is included + // here in the schema because it is required when decoding/encoding from/to other encodings (e.g. DAG-JSON). + // If `payload` is present during decode, `link` is added with contents matching `payload`. If `link` is present + // during encode, it is validated against `payload` and then ignored. + schema.SpawnStructField("link", "Link", true, false), + + schema.SpawnStructField("payload", "Raw", true, false), + schema.SpawnStructField("protected", "Raw", true, false), + schema.SpawnStructField("recipients", "EncodedRecipients", true, false), + schema.SpawnStructField("signatures", "EncodedSignatures", true, false), + schema.SpawnStructField("tag", "Raw", true, false), + schema.SpawnStructField("unprotected", "Any", true, false), + }, schema.SpawnStructRepresentationMap(nil))) + + if errs := ts.ValidateGraph(); errs != nil { + for _, err := range errs { + fmt.Printf("- %s\n", err) + } + panic("invalid schema") + } + + gengo.Generate(os.Args[1], "dagjose", ts, &gengo.AdjunctCfg{ + // This is important for the `Any` union to work correctly + CfgUnionMemlayout: map[schema.TypeName]string{"Any": "interface"}, + }) +} diff --git a/dagjose/header_assembler.go b/dagjose/header_assembler.go deleted file mode 100644 index 3f68eb5..0000000 --- a/dagjose/header_assembler.go +++ /dev/null @@ -1,210 +0,0 @@ -package dagjose - -import ( - "fmt" - - ipld "github.com/ipld/go-ipld-prime" - basicnode "github.com/ipld/go-ipld-prime/node/basic" - "github.com/ipld/go-ipld-prime/node/mixins" -) - -type headerAssembler struct { - header map[string]ipld.Node - valueBuilder ipld.NodeBuilder - key *string - state maState -} - -func (h *headerAssembler) AssembleKey() ipld.NodeAssembler { - if h.state != maState_initial { - panic("misuse") - } - h.state = maState_midKey - return h -} -func (h *headerAssembler) AssembleValue() ipld.NodeAssembler { - if h.state != maState_expectValue { - panic("misuse") - } - h.state = maState_midValue - h.valueBuilder = basicnode.Prototype.Any.NewBuilder() - return h.valueBuilder -} -func (h *headerAssembler) AssembleEntry(k string) (ipld.NodeAssembler, error) { - if h.state != maState_initial { - panic("misuse") - } - h.key = &k - h.state = maState_midValue - return h, nil -} -func (h *headerAssembler) Finish() error { return nil } -func (h *headerAssembler) KeyPrototype() ipld.NodePrototype { - return basicnode.Prototype.String -} -func (h *headerAssembler) ValuePrototype(k string) ipld.NodePrototype { - return basicnode.Prototype.String -} - -var headerMixin = mixins.MapAssembler{TypeName: "header"} - -func (h *headerAssembler) BeginMap(sizeHint int64) (ipld.MapAssembler, error) { - if h.state == maState_midValue { - h.valueBuilder = basicnode.Prototype.Map.NewBuilder() - ma, err := h.valueBuilder.BeginMap(sizeHint) - if err != nil { - return nil, err - } - hvam := headerValueAssemblerMap{ - ha: h, - ma: ma, - } - return &hvam, nil - } - return mixins.StringAssembler{TypeName: "string"}.BeginMap(0) -} -func (h *headerAssembler) BeginList(sizeHint int64) (ipld.ListAssembler, error) { - if h.state == maState_midValue { - h.state = maState_initial - h.valueBuilder = basicnode.Prototype.List.NewBuilder() - la, err := h.valueBuilder.BeginList(sizeHint) - if err != nil { - return nil, err - } - hval := headerValueAssemblerList{ - ha: h, - la: la, - } - return &hval, nil - } - return headerMixin.BeginList(sizeHint) -} -func (h *headerAssembler) AssignNull() error { - if h.state == maState_midValue { - return h.AssignNode(ipld.Null) - } - return headerMixin.AssignNull() -} -func (h *headerAssembler) AssignBool(b bool) error { - if h.state == maState_midValue { - return h.AssignNode(basicnode.NewBool(b)) - } - return headerMixin.AssignBool(b) -} -func (h *headerAssembler) AssignInt(i int64) error { - if h.state == maState_midValue { - return h.AssignNode(basicnode.NewInt(i)) - } - return headerMixin.AssignInt(i) -} -func (h *headerAssembler) AssignFloat(f float64) error { - if h.state == maState_midValue { - return h.AssignNode(basicnode.NewFloat(f)) - } - return headerMixin.AssignFloat(f) -} -func (h *headerAssembler) AssignString(s string) error { - if h.state == maState_midKey { - h.key = &s - h.state = maState_expectValue - return nil - } - if h.state == maState_midValue { - return h.AssignNode(basicnode.NewString(s)) - } - return headerMixin.AssignString(s) -} -func (h *headerAssembler) AssignBytes(b []byte) error { - if h.state == maState_midValue { - return h.AssignNode(basicnode.NewBytes(b)) - } - return headerMixin.AssignBytes(b) -} -func (h *headerAssembler) AssignLink(l ipld.Link) error { - if h.state == maState_midValue { - return h.AssignNode(basicnode.NewLink(l)) - } - return headerMixin.AssignLink(l) -} -func (h *headerAssembler) AssignNode(n ipld.Node) error { - if h.state == maState_midKey { - k, err := n.AsString() - if err != nil { - return fmt.Errorf("cannot get string from key: %v", err) - } - h.key = &k - h.state = maState_expectValue - return nil - } - if h.state == maState_midValue { - h.header[*h.key] = n - h.state = maState_initial - h.key = nil - h.valueBuilder = nil - return nil - } - return fmt.Errorf("Attempted to assign node on header in bad state") -} -func (h *headerAssembler) Prototype() ipld.NodePrototype { - return basicnode.Prototype.Map -} - -type headerValueAssemblerMap struct { - ha *headerAssembler - ma ipld.MapAssembler -} - -func (hvam *headerValueAssemblerMap) AssembleKey() ipld.NodeAssembler { - return hvam.ma.AssembleKey() -} - -func (hvam *headerValueAssemblerMap) AssembleValue() ipld.NodeAssembler { - return hvam.ma.AssembleValue() -} - -func (hvam *headerValueAssemblerMap) AssembleEntry(s string) (ipld.NodeAssembler, error) { - return hvam.ma.AssembleEntry(s) -} - -func (hvam *headerValueAssemblerMap) Finish() error { - if err := hvam.ma.Finish(); err != nil { - return err - } - hvam.ha.header[*hvam.ha.key] = hvam.ha.valueBuilder.Build() - hvam.ha.state = maState_initial - hvam.ha.key = nil - hvam.ha.valueBuilder = nil - return nil -} - -func (hvam *headerValueAssemblerMap) KeyPrototype() ipld.NodePrototype { - return basicnode.Prototype.String -} - -func (hvam *headerValueAssemblerMap) ValuePrototype(k string) ipld.NodePrototype { - return basicnode.Prototype.Any -} - -type headerValueAssemblerList struct { - ha *headerAssembler - la ipld.ListAssembler -} - -func (hval *headerValueAssemblerList) AssembleValue() ipld.NodeAssembler { - return hval.la.AssembleValue() -} - -func (hval *headerValueAssemblerList) Finish() error { - if err := hval.la.Finish(); err != nil { - return err - } - hval.ha.header[*hval.ha.key] = hval.ha.valueBuilder.Build() - hval.ha.state = maState_initial - hval.ha.key = nil - hval.ha.valueBuilder = nil - return nil -} - -func (hval *headerValueAssemblerList) ValuePrototype(idx int64) ipld.NodePrototype { - return basicnode.Prototype.Any -} diff --git a/dagjose/ipldsch_minima.go b/dagjose/ipldsch_minima.go new file mode 100644 index 0000000..236e73d --- /dev/null +++ b/dagjose/ipldsch_minima.go @@ -0,0 +1,51 @@ +package dagjose + +// Code generated by go-ipld-prime gengo. DO NOT EDIT. + +import ( + "fmt" + + "github.com/ipld/go-ipld-prime/datamodel" + "github.com/ipld/go-ipld-prime/schema" +) + +const ( + midvalue = schema.Maybe(4) + allowNull = schema.Maybe(5) +) + +type maState uint8 + +const ( + maState_initial maState = iota + maState_midKey + maState_expectValue + maState_midValue + maState_finished +) + +type laState uint8 + +const ( + laState_initial laState = iota + laState_midValue + laState_finished +) + +type _ErrorThunkAssembler struct { + e error +} + +func (ea _ErrorThunkAssembler) BeginMap(_ int64) (datamodel.MapAssembler, error) { return nil, ea.e } +func (ea _ErrorThunkAssembler) BeginList(_ int64) (datamodel.ListAssembler, error) { return nil, ea.e } +func (ea _ErrorThunkAssembler) AssignNull() error { return ea.e } +func (ea _ErrorThunkAssembler) AssignBool(bool) error { return ea.e } +func (ea _ErrorThunkAssembler) AssignInt(int64) error { return ea.e } +func (ea _ErrorThunkAssembler) AssignFloat(float64) error { return ea.e } +func (ea _ErrorThunkAssembler) AssignString(string) error { return ea.e } +func (ea _ErrorThunkAssembler) AssignBytes([]byte) error { return ea.e } +func (ea _ErrorThunkAssembler) AssignLink(datamodel.Link) error { return ea.e } +func (ea _ErrorThunkAssembler) AssignNode(datamodel.Node) error { return ea.e } +func (ea _ErrorThunkAssembler) Prototype() datamodel.NodePrototype { + panic(fmt.Errorf("cannot get prototype from error-carrying assembler: already derailed with error: %w", ea.e)) +} diff --git a/dagjose/ipldsch_satisfaction.go b/dagjose/ipldsch_satisfaction.go new file mode 100644 index 0000000..3667502 --- /dev/null +++ b/dagjose/ipldsch_satisfaction.go @@ -0,0 +1,13394 @@ +package dagjose + +// Code generated by go-ipld-prime gengo. DO NOT EDIT. + +import ( + "github.com/ipld/go-ipld-prime/datamodel" + "github.com/ipld/go-ipld-prime/node/mixins" + "github.com/ipld/go-ipld-prime/schema" +) + +func (n _Any) AsInterface() _Any__iface { + return n.x +} + +type _Any__Maybe struct { + m schema.Maybe + v Any +} +type MaybeAny = *_Any__Maybe + +func (m MaybeAny) IsNull() bool { + return m.m == schema.Maybe_Null +} +func (m MaybeAny) IsAbsent() bool { + return m.m == schema.Maybe_Absent +} +func (m MaybeAny) Exists() bool { + return m.m == schema.Maybe_Value +} +func (m MaybeAny) AsNode() datamodel.Node { + switch m.m { + case schema.Maybe_Absent: + return datamodel.Absent + case schema.Maybe_Null: + return datamodel.Null + case schema.Maybe_Value: + return m.v + default: + panic("unreachable") + } +} +func (m MaybeAny) Must() Any { + if !m.Exists() { + panic("unbox of a maybe rejected") + } + return m.v +} + +var ( + memberName__Any_String = _String{"String"} + memberName__Any_Bytes = _String{"Bytes"} + memberName__Any_Int = _String{"Int"} + memberName__Any_Float = _String{"Float"} + memberName__Any_Map = _String{"Map"} + memberName__Any_List = _String{"List"} +) +var _ datamodel.Node = (Any)(&_Any{}) +var _ schema.TypedNode = (Any)(&_Any{}) + +func (Any) Kind() datamodel.Kind { + return datamodel.Kind_Map +} +func (n Any) LookupByString(key string) (datamodel.Node, error) { + switch key { + case "String": + if n2, ok := n.x.(String); ok { + return n2, nil + } else { + return nil, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + case "Bytes": + if n2, ok := n.x.(Bytes); ok { + return n2, nil + } else { + return nil, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + case "Int": + if n2, ok := n.x.(Int); ok { + return n2, nil + } else { + return nil, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + case "Float": + if n2, ok := n.x.(Float); ok { + return n2, nil + } else { + return nil, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + case "Map": + if n2, ok := n.x.(Map); ok { + return n2, nil + } else { + return nil, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + case "List": + if n2, ok := n.x.(List); ok { + return n2, nil + } else { + return nil, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + default: + return nil, schema.ErrNoSuchField{Type: nil /*TODO*/, Field: datamodel.PathSegmentOfString(key)} + } +} +func (n Any) LookupByNode(key datamodel.Node) (datamodel.Node, error) { + ks, err := key.AsString() + if err != nil { + return nil, err + } + return n.LookupByString(ks) +} +func (Any) LookupByIndex(idx int64) (datamodel.Node, error) { + return mixins.Map{TypeName: "dagjose.Any"}.LookupByIndex(0) +} +func (n Any) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + return n.LookupByString(seg.String()) +} +func (n Any) MapIterator() datamodel.MapIterator { + return &_Any__MapItr{n, false} +} + +type _Any__MapItr struct { + n Any + done bool +} + +func (itr *_Any__MapItr) Next() (k datamodel.Node, v datamodel.Node, _ error) { + if itr.done { + return nil, nil, datamodel.ErrIteratorOverread{} + } + switch n2 := itr.n.x.(type) { + case String: + k, v = &memberName__Any_String, n2 + case Bytes: + k, v = &memberName__Any_Bytes, n2 + case Int: + k, v = &memberName__Any_Int, n2 + case Float: + k, v = &memberName__Any_Float, n2 + case Map: + k, v = &memberName__Any_Map, n2 + case List: + k, v = &memberName__Any_List, n2 + default: + panic("unreachable") + } + itr.done = true + return +} +func (itr *_Any__MapItr) Done() bool { + return itr.done +} + +func (Any) ListIterator() datamodel.ListIterator { + return nil +} +func (Any) Length() int64 { + return 1 +} +func (Any) IsAbsent() bool { + return false +} +func (Any) IsNull() bool { + return false +} +func (Any) AsBool() (bool, error) { + return mixins.Map{TypeName: "dagjose.Any"}.AsBool() +} +func (Any) AsInt() (int64, error) { + return mixins.Map{TypeName: "dagjose.Any"}.AsInt() +} +func (Any) AsFloat() (float64, error) { + return mixins.Map{TypeName: "dagjose.Any"}.AsFloat() +} +func (Any) AsString() (string, error) { + return mixins.Map{TypeName: "dagjose.Any"}.AsString() +} +func (Any) AsBytes() ([]byte, error) { + return mixins.Map{TypeName: "dagjose.Any"}.AsBytes() +} +func (Any) AsLink() (datamodel.Link, error) { + return mixins.Map{TypeName: "dagjose.Any"}.AsLink() +} +func (Any) Prototype() datamodel.NodePrototype { + return _Any__Prototype{} +} + +type _Any__Prototype struct{} + +func (_Any__Prototype) NewBuilder() datamodel.NodeBuilder { + var nb _Any__Builder + nb.Reset() + return &nb +} + +type _Any__Builder struct { + _Any__Assembler +} + +func (nb *_Any__Builder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_Any__Builder) Reset() { + var w _Any + var m schema.Maybe + *nb = _Any__Builder{_Any__Assembler{w: &w, m: &m}} +} + +type _Any__Assembler struct { + w *_Any + m *schema.Maybe + state maState + + cm schema.Maybe + ca1 *_String__Assembler + + ca2 *_Bytes__Assembler + + ca3 *_Int__Assembler + + ca4 *_Float__Assembler + + ca5 *_Map__Assembler + + ca6 *_List__Assembler + ca uint +} + +func (na *_Any__Assembler) reset() { + na.state = maState_initial + switch na.ca { + case 0: + return + case 1: + na.ca1.reset() + + case 2: + na.ca2.reset() + + case 3: + na.ca3.reset() + + case 4: + na.ca4.reset() + + case 5: + na.ca5.reset() + + case 6: + na.ca6.reset() + default: + panic("unreachable") + } + na.ca = 0 + na.cm = schema.Maybe_Absent +} +func (na *_Any__Assembler) BeginMap(int64) (datamodel.MapAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if na.w == nil { + na.w = &_Any{} + } + return na, nil +} +func (_Any__Assembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.MapAssembler{TypeName: "dagjose.Any"}.BeginList(0) +} +func (na *_Any__Assembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.MapAssembler{TypeName: "dagjose.Any"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_Any__Assembler) AssignBool(bool) error { + return mixins.MapAssembler{TypeName: "dagjose.Any"}.AssignBool(false) +} +func (_Any__Assembler) AssignInt(int64) error { + return mixins.MapAssembler{TypeName: "dagjose.Any"}.AssignInt(0) +} +func (_Any__Assembler) AssignFloat(float64) error { + return mixins.MapAssembler{TypeName: "dagjose.Any"}.AssignFloat(0) +} +func (_Any__Assembler) AssignString(string) error { + return mixins.MapAssembler{TypeName: "dagjose.Any"}.AssignString("") +} +func (_Any__Assembler) AssignBytes([]byte) error { + return mixins.MapAssembler{TypeName: "dagjose.Any"}.AssignBytes(nil) +} +func (_Any__Assembler) AssignLink(datamodel.Link) error { + return mixins.MapAssembler{TypeName: "dagjose.Any"}.AssignLink(nil) +} +func (na *_Any__Assembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_Any); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + if na.w == nil { + na.w = v2 + *na.m = schema.Maybe_Value + return nil + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_Map { + return datamodel.ErrWrongKind{TypeName: "dagjose.Any", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustMap, ActualKind: v.Kind()} + } + itr := v.MapIterator() + for !itr.Done() { + k, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleKey().AssignNode(k); err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_Any__Assembler) Prototype() datamodel.NodePrototype { + return _Any__Prototype{} +} +func (ma *_Any__Assembler) valueFinishTidy() bool { + switch ma.cm { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } +} +func (ma *_Any__Assembler) AssembleEntry(k string) (datamodel.NodeAssembler, error) { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleEntry cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling a value") + } // if tidy success: carry on for the moment, but we'll still be erroring shortly. + case maState_finished: + panic("invalid state: AssembleEntry cannot be called on an assembler that's already finished") + } + if ma.ca != 0 { + return nil, schema.ErrNotUnionStructure{TypeName: "dagjose.Any", Detail: "cannot add another entry -- a union can only contain one thing!"} + } + switch k { + case "String": + ma.state = maState_midValue + ma.ca = 1 + x := &_String{} + ma.w.x = x + if ma.ca1 == nil { + ma.ca1 = &_String__Assembler{} + } + ma.ca1.w = x + ma.ca1.m = &ma.cm + return ma.ca1, nil + case "Bytes": + ma.state = maState_midValue + ma.ca = 2 + x := &_Bytes{} + ma.w.x = x + if ma.ca2 == nil { + ma.ca2 = &_Bytes__Assembler{} + } + ma.ca2.w = x + ma.ca2.m = &ma.cm + return ma.ca2, nil + case "Int": + ma.state = maState_midValue + ma.ca = 3 + x := &_Int{} + ma.w.x = x + if ma.ca3 == nil { + ma.ca3 = &_Int__Assembler{} + } + ma.ca3.w = x + ma.ca3.m = &ma.cm + return ma.ca3, nil + case "Float": + ma.state = maState_midValue + ma.ca = 4 + x := &_Float{} + ma.w.x = x + if ma.ca4 == nil { + ma.ca4 = &_Float__Assembler{} + } + ma.ca4.w = x + ma.ca4.m = &ma.cm + return ma.ca4, nil + case "Map": + ma.state = maState_midValue + ma.ca = 5 + x := &_Map{} + ma.w.x = x + if ma.ca5 == nil { + ma.ca5 = &_Map__Assembler{} + } + ma.ca5.w = x + ma.ca5.m = &ma.cm + return ma.ca5, nil + case "List": + ma.state = maState_midValue + ma.ca = 6 + x := &_List{} + ma.w.x = x + if ma.ca6 == nil { + ma.ca6 = &_List__Assembler{} + } + ma.ca6.w = x + ma.ca6.m = &ma.cm + return ma.ca6, nil + } + return nil, schema.ErrInvalidKey{TypeName: "dagjose.Any", Key: &_String{k}} +} +func (ma *_Any__Assembler) AssembleKey() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleKey cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleKey cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleKey cannot be called when in the middle of assembling a value") + } // if tidy success: carry on for the moment, but we'll still be erroring shortly... or rather, the keyassembler will be. + case maState_finished: + panic("invalid state: AssembleKey cannot be called on an assembler that's already finished") + } + ma.state = maState_midKey + return (*_Any__KeyAssembler)(ma) +} +func (ma *_Any__Assembler) AssembleValue() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + panic("invalid state: AssembleValue cannot be called when no key is primed") + case maState_midKey: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling a key") + case maState_expectValue: + // carry on + case maState_midValue: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling another value") + case maState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + ma.state = maState_midValue + switch ma.ca { + case 1: + x := &_String{} + ma.w.x = x + if ma.ca1 == nil { + ma.ca1 = &_String__Assembler{} + } + ma.ca1.w = x + ma.ca1.m = &ma.cm + return ma.ca1 + case 2: + x := &_Bytes{} + ma.w.x = x + if ma.ca2 == nil { + ma.ca2 = &_Bytes__Assembler{} + } + ma.ca2.w = x + ma.ca2.m = &ma.cm + return ma.ca2 + case 3: + x := &_Int{} + ma.w.x = x + if ma.ca3 == nil { + ma.ca3 = &_Int__Assembler{} + } + ma.ca3.w = x + ma.ca3.m = &ma.cm + return ma.ca3 + case 4: + x := &_Float{} + ma.w.x = x + if ma.ca4 == nil { + ma.ca4 = &_Float__Assembler{} + } + ma.ca4.w = x + ma.ca4.m = &ma.cm + return ma.ca4 + case 5: + x := &_Map{} + ma.w.x = x + if ma.ca5 == nil { + ma.ca5 = &_Map__Assembler{} + } + ma.ca5.w = x + ma.ca5.m = &ma.cm + return ma.ca5 + case 6: + x := &_List{} + ma.w.x = x + if ma.ca6 == nil { + ma.ca6 = &_List__Assembler{} + } + ma.ca6.w = x + ma.ca6.m = &ma.cm + return ma.ca6 + default: + panic("unreachable") + } +} +func (ma *_Any__Assembler) Finish() error { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: Finish cannot be called when in the middle of assembling a key") + case maState_expectValue: + panic("invalid state: Finish cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + if ma.ca == 0 { + return schema.ErrNotUnionStructure{TypeName: "dagjose.Any", Detail: "a union must have exactly one entry (not none)!"} + } + ma.state = maState_finished + *ma.m = schema.Maybe_Value + return nil +} +func (ma *_Any__Assembler) KeyPrototype() datamodel.NodePrototype { + return _String__Prototype{} +} +func (ma *_Any__Assembler) ValuePrototype(k string) datamodel.NodePrototype { + switch k { + case "String": + return _String__Prototype{} + case "Bytes": + return _Bytes__Prototype{} + case "Int": + return _Int__Prototype{} + case "Float": + return _Float__Prototype{} + case "Map": + return _Map__Prototype{} + case "List": + return _List__Prototype{} + default: + return nil + } +} + +type _Any__KeyAssembler _Any__Assembler + +func (_Any__KeyAssembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.Any.KeyAssembler"}.BeginMap(0) +} +func (_Any__KeyAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.Any.KeyAssembler"}.BeginList(0) +} +func (na *_Any__KeyAssembler) AssignNull() error { + return mixins.StringAssembler{TypeName: "dagjose.Any.KeyAssembler"}.AssignNull() +} +func (_Any__KeyAssembler) AssignBool(bool) error { + return mixins.StringAssembler{TypeName: "dagjose.Any.KeyAssembler"}.AssignBool(false) +} +func (_Any__KeyAssembler) AssignInt(int64) error { + return mixins.StringAssembler{TypeName: "dagjose.Any.KeyAssembler"}.AssignInt(0) +} +func (_Any__KeyAssembler) AssignFloat(float64) error { + return mixins.StringAssembler{TypeName: "dagjose.Any.KeyAssembler"}.AssignFloat(0) +} +func (ka *_Any__KeyAssembler) AssignString(k string) error { + if ka.state != maState_midKey { + panic("misuse: KeyAssembler held beyond its valid lifetime") + } + if ka.ca != 0 { + return schema.ErrNotUnionStructure{TypeName: "dagjose.Any", Detail: "cannot add another entry -- a union can only contain one thing!"} + } + switch k { + case "String": + ka.ca = 1 + ka.state = maState_expectValue + return nil + case "Bytes": + ka.ca = 2 + ka.state = maState_expectValue + return nil + case "Int": + ka.ca = 3 + ka.state = maState_expectValue + return nil + case "Float": + ka.ca = 4 + ka.state = maState_expectValue + return nil + case "Map": + ka.ca = 5 + ka.state = maState_expectValue + return nil + case "List": + ka.ca = 6 + ka.state = maState_expectValue + return nil + } + return schema.ErrInvalidKey{TypeName: "dagjose.Any", Key: &_String{k}} // TODO: error quality: ErrInvalidUnionDiscriminant ? +} +func (_Any__KeyAssembler) AssignBytes([]byte) error { + return mixins.StringAssembler{TypeName: "dagjose.Any.KeyAssembler"}.AssignBytes(nil) +} +func (_Any__KeyAssembler) AssignLink(datamodel.Link) error { + return mixins.StringAssembler{TypeName: "dagjose.Any.KeyAssembler"}.AssignLink(nil) +} +func (ka *_Any__KeyAssembler) AssignNode(v datamodel.Node) error { + if v2, err := v.AsString(); err != nil { + return err + } else { + return ka.AssignString(v2) + } +} +func (_Any__KeyAssembler) Prototype() datamodel.NodePrototype { + return _String__Prototype{} +} +func (Any) Type() schema.Type { + return nil /*TODO:typelit*/ +} +func (n Any) Representation() datamodel.Node { + return (*_Any__Repr)(n) +} + +type _Any__Repr _Any + +var _ datamodel.Node = &_Any__Repr{} + +func (n *_Any__Repr) Kind() datamodel.Kind { + switch n.x.(type) { + case String: + return datamodel.Kind_String + case Bytes: + return datamodel.Kind_Bytes + case Int: + return datamodel.Kind_Int + case Float: + return datamodel.Kind_Float + case Map: + return datamodel.Kind_Map + case List: + return datamodel.Kind_List + default: + panic("unreachable") + } +} +func (n *_Any__Repr) LookupByString(key string) (datamodel.Node, error) { + switch n2 := n.x.(type) { + case Map: + return n2.Representation().LookupByString(key) + default: + return nil, datamodel.ErrWrongKind{TypeName: "dagjose.Any.Repr", MethodName: "LookupByString", AppropriateKind: datamodel.KindSet_JustMap, ActualKind: n.Kind()} + } +} +func (n *_Any__Repr) LookupByNode(key datamodel.Node) (datamodel.Node, error) { + switch n2 := n.x.(type) { + case Map: + return n2.Representation().LookupByNode(key) + case List: + return n2.Representation().LookupByNode(key) + default: + return nil, datamodel.ErrWrongKind{TypeName: "dagjose.Any.Repr", MethodName: "LookupByNode", AppropriateKind: datamodel.KindSet_Recursive, ActualKind: n.Kind()} + } +} +func (n *_Any__Repr) LookupByIndex(idx int64) (datamodel.Node, error) { + switch n2 := n.x.(type) { + case List: + return n2.Representation().LookupByIndex(idx) + default: + return nil, datamodel.ErrWrongKind{TypeName: "dagjose.Any.Repr", MethodName: "LookupByIndex", AppropriateKind: datamodel.KindSet_JustList, ActualKind: n.Kind()} + } +} +func (n *_Any__Repr) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + switch n2 := n.x.(type) { + case Map: + return n2.Representation().LookupBySegment(seg) + case List: + return n2.Representation().LookupBySegment(seg) + default: + return nil, datamodel.ErrWrongKind{TypeName: "dagjose.Any.Repr", MethodName: "LookupBySegment", AppropriateKind: datamodel.KindSet_Recursive, ActualKind: n.Kind()} + } +} +func (n *_Any__Repr) MapIterator() datamodel.MapIterator { + switch n2 := n.x.(type) { + case Map: + return n2.Representation().MapIterator() + default: + return nil + } +} +func (n *_Any__Repr) ListIterator() datamodel.ListIterator { + switch n2 := n.x.(type) { + case List: + return n2.Representation().ListIterator() + default: + return nil + } +} +func (n *_Any__Repr) Length() int64 { + switch n2 := n.x.(type) { + case Map: + return n2.Representation().Length() + case List: + return n2.Representation().Length() + default: + return -1 + } +} +func (n *_Any__Repr) IsAbsent() bool { + return false +} +func (n *_Any__Repr) IsNull() bool { + return false +} +func (n *_Any__Repr) AsBool() (bool, error) { + return false, datamodel.ErrWrongKind{TypeName: "dagjose.Any.Repr", MethodName: "AsBool", AppropriateKind: datamodel.KindSet_JustBool, ActualKind: n.Kind()} +} +func (n *_Any__Repr) AsInt() (int64, error) { + switch n2 := n.x.(type) { + case Int: + return n2.Representation().AsInt() + default: + return 0, datamodel.ErrWrongKind{TypeName: "dagjose.Any.Repr", MethodName: "AsInt", AppropriateKind: datamodel.KindSet_JustInt, ActualKind: n.Kind()} + } +} +func (n *_Any__Repr) AsFloat() (float64, error) { + switch n2 := n.x.(type) { + case Float: + return n2.Representation().AsFloat() + default: + return 0, datamodel.ErrWrongKind{TypeName: "dagjose.Any.Repr", MethodName: "AsFloat", AppropriateKind: datamodel.KindSet_JustFloat, ActualKind: n.Kind()} + } +} +func (n *_Any__Repr) AsString() (string, error) { + switch n2 := n.x.(type) { + case String: + return n2.Representation().AsString() + default: + return "", datamodel.ErrWrongKind{TypeName: "dagjose.Any.Repr", MethodName: "AsString", AppropriateKind: datamodel.KindSet_JustString, ActualKind: n.Kind()} + } +} +func (n *_Any__Repr) AsBytes() ([]byte, error) { + switch n2 := n.x.(type) { + case Bytes: + return n2.Representation().AsBytes() + default: + return nil, datamodel.ErrWrongKind{TypeName: "dagjose.Any.Repr", MethodName: "AsBytes", AppropriateKind: datamodel.KindSet_JustBytes, ActualKind: n.Kind()} + } +} +func (n *_Any__Repr) AsLink() (datamodel.Link, error) { + return nil, datamodel.ErrWrongKind{TypeName: "dagjose.Any.Repr", MethodName: "AsLink", AppropriateKind: datamodel.KindSet_JustLink, ActualKind: n.Kind()} +} +func (_Any__Repr) Prototype() datamodel.NodePrototype { + return _Any__ReprPrototype{} +} + +type _Any__ReprPrototype struct{} + +func (_Any__ReprPrototype) NewBuilder() datamodel.NodeBuilder { + var nb _Any__ReprBuilder + nb.Reset() + return &nb +} + +type _Any__ReprBuilder struct { + _Any__ReprAssembler +} + +func (nb *_Any__ReprBuilder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_Any__ReprBuilder) Reset() { + var w _Any + var m schema.Maybe + *nb = _Any__ReprBuilder{_Any__ReprAssembler{w: &w, m: &m}} +} + +type _Any__ReprAssembler struct { + w *_Any + m *schema.Maybe + ca1 *_String__ReprAssembler + ca2 *_Bytes__ReprAssembler + ca3 *_Int__ReprAssembler + ca4 *_Float__ReprAssembler + ca5 *_Map__ReprAssembler + ca6 *_List__ReprAssembler + ca uint +} + +func (na *_Any__ReprAssembler) reset() { + switch na.ca { + case 0: + return + case 1: + na.ca1.reset() + case 2: + na.ca2.reset() + case 3: + na.ca3.reset() + case 4: + na.ca4.reset() + case 5: + na.ca5.reset() + case 6: + na.ca6.reset() + default: + panic("unreachable") + } + na.ca = 0 +} +func (na *_Any__ReprAssembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign into assembler that's already working on a larger structure!") + } + if na.w == nil { + na.w = &_Any{} + } + na.ca = 5 + x := &_Map{} + na.w.x = x + if na.ca5 == nil { + na.ca5 = &_Map__ReprAssembler{} + } + na.ca5.w = x + na.ca5.m = na.m + return na.ca5.BeginMap(sizeHint) +} +func (na *_Any__ReprAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign into assembler that's already working on a larger structure!") + } + if na.w == nil { + na.w = &_Any{} + } + na.ca = 6 + x := &_List{} + na.w.x = x + if na.ca6 == nil { + na.ca6 = &_List__ReprAssembler{} + } + na.ca6.w = x + na.ca6.m = na.m + return na.ca6.BeginList(sizeHint) +} +func (na *_Any__ReprAssembler) AssignNull() error { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign into assembler that's already working on a larger structure!") + } + return schema.ErrNotUnionStructure{TypeName: "dagjose.Any.Repr", Detail: "AssignNull called but is not valid for any of the kinds that are valid members of this union"} +} +func (na *_Any__ReprAssembler) AssignBool(v bool) error { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign into assembler that's already working on a larger structure!") + } + return schema.ErrNotUnionStructure{TypeName: "dagjose.Any.Repr", Detail: "AssignBool called but is not valid for any of the kinds that are valid members of this union"} +} +func (na *_Any__ReprAssembler) AssignInt(v int64) error { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign into assembler that's already working on a larger structure!") + } + if na.w == nil { + na.w = &_Any{} + } + na.ca = 3 + x := &_Int{} + na.w.x = x + if na.ca3 == nil { + na.ca3 = &_Int__ReprAssembler{} + } + na.ca3.w = x + na.ca3.m = na.m + return na.ca3.AssignInt(v) +} +func (na *_Any__ReprAssembler) AssignFloat(v float64) error { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign into assembler that's already working on a larger structure!") + } + if na.w == nil { + na.w = &_Any{} + } + na.ca = 4 + x := &_Float{} + na.w.x = x + if na.ca4 == nil { + na.ca4 = &_Float__ReprAssembler{} + } + na.ca4.w = x + na.ca4.m = na.m + return na.ca4.AssignFloat(v) +} +func (na *_Any__ReprAssembler) AssignString(v string) error { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign into assembler that's already working on a larger structure!") + } + if na.w == nil { + na.w = &_Any{} + } + na.ca = 1 + x := &_String{} + na.w.x = x + if na.ca1 == nil { + na.ca1 = &_String__ReprAssembler{} + } + na.ca1.w = x + na.ca1.m = na.m + return na.ca1.AssignString(v) +} +func (na *_Any__ReprAssembler) AssignBytes(v []byte) error { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign into assembler that's already working on a larger structure!") + } + if na.w == nil { + na.w = &_Any{} + } + na.ca = 2 + x := &_Bytes{} + na.w.x = x + if na.ca2 == nil { + na.ca2 = &_Bytes__ReprAssembler{} + } + na.ca2.w = x + na.ca2.m = na.m + return na.ca2.AssignBytes(v) +} +func (na *_Any__ReprAssembler) AssignLink(v datamodel.Link) error { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign into assembler that's already working on a larger structure!") + } + return schema.ErrNotUnionStructure{TypeName: "dagjose.Any.Repr", Detail: "AssignLink called but is not valid for any of the kinds that are valid members of this union"} +} +func (na *_Any__ReprAssembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_Any); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + if na.w == nil { + na.w = v2 + *na.m = schema.Maybe_Value + return nil + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + switch v.Kind() { + case datamodel.Kind_Bool: + v2, _ := v.AsBool() + return na.AssignBool(v2) + case datamodel.Kind_Int: + v2, _ := v.AsInt() + return na.AssignInt(v2) + case datamodel.Kind_Float: + v2, _ := v.AsFloat() + return na.AssignFloat(v2) + case datamodel.Kind_String: + v2, _ := v.AsString() + return na.AssignString(v2) + case datamodel.Kind_Bytes: + v2, _ := v.AsBytes() + return na.AssignBytes(v2) + case datamodel.Kind_Map: + na, err := na.BeginMap(v.Length()) + if err != nil { + return err + } + itr := v.MapIterator() + for !itr.Done() { + k, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleKey().AssignNode(k); err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() + case datamodel.Kind_List: + na, err := na.BeginList(v.Length()) + if err != nil { + return err + } + itr := v.ListIterator() + for !itr.Done() { + _, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() + case datamodel.Kind_Link: + v2, _ := v.AsLink() + return na.AssignLink(v2) + default: + panic("unreachable") + } +} +func (na *_Any__ReprAssembler) Prototype() datamodel.NodePrototype { + return _Any__ReprPrototype{} +} + +func (n Bytes) Bytes() []byte { + return n.x +} +func (_Bytes__Prototype) FromBytes(v []byte) (Bytes, error) { + n := _Bytes{v} + return &n, nil +} + +type _Bytes__Maybe struct { + m schema.Maybe + v _Bytes +} +type MaybeBytes = *_Bytes__Maybe + +func (m MaybeBytes) IsNull() bool { + return m.m == schema.Maybe_Null +} +func (m MaybeBytes) IsAbsent() bool { + return m.m == schema.Maybe_Absent +} +func (m MaybeBytes) Exists() bool { + return m.m == schema.Maybe_Value +} +func (m MaybeBytes) AsNode() datamodel.Node { + switch m.m { + case schema.Maybe_Absent: + return datamodel.Absent + case schema.Maybe_Null: + return datamodel.Null + case schema.Maybe_Value: + return &m.v + default: + panic("unreachable") + } +} +func (m MaybeBytes) Must() Bytes { + if !m.Exists() { + panic("unbox of a maybe rejected") + } + return &m.v +} + +var _ datamodel.Node = (Bytes)(&_Bytes{}) +var _ schema.TypedNode = (Bytes)(&_Bytes{}) + +func (Bytes) Kind() datamodel.Kind { + return datamodel.Kind_Bytes +} +func (Bytes) LookupByString(string) (datamodel.Node, error) { + return mixins.Bytes{TypeName: "dagjose.Bytes"}.LookupByString("") +} +func (Bytes) LookupByNode(datamodel.Node) (datamodel.Node, error) { + return mixins.Bytes{TypeName: "dagjose.Bytes"}.LookupByNode(nil) +} +func (Bytes) LookupByIndex(idx int64) (datamodel.Node, error) { + return mixins.Bytes{TypeName: "dagjose.Bytes"}.LookupByIndex(0) +} +func (Bytes) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + return mixins.Bytes{TypeName: "dagjose.Bytes"}.LookupBySegment(seg) +} +func (Bytes) MapIterator() datamodel.MapIterator { + return nil +} +func (Bytes) ListIterator() datamodel.ListIterator { + return nil +} +func (Bytes) Length() int64 { + return -1 +} +func (Bytes) IsAbsent() bool { + return false +} +func (Bytes) IsNull() bool { + return false +} +func (Bytes) AsBool() (bool, error) { + return mixins.Bytes{TypeName: "dagjose.Bytes"}.AsBool() +} +func (Bytes) AsInt() (int64, error) { + return mixins.Bytes{TypeName: "dagjose.Bytes"}.AsInt() +} +func (Bytes) AsFloat() (float64, error) { + return mixins.Bytes{TypeName: "dagjose.Bytes"}.AsFloat() +} +func (Bytes) AsString() (string, error) { + return mixins.Bytes{TypeName: "dagjose.Bytes"}.AsString() +} +func (n Bytes) AsBytes() ([]byte, error) { + return n.x, nil +} +func (Bytes) AsLink() (datamodel.Link, error) { + return mixins.Bytes{TypeName: "dagjose.Bytes"}.AsLink() +} +func (Bytes) Prototype() datamodel.NodePrototype { + return _Bytes__Prototype{} +} + +type _Bytes__Prototype struct{} + +func (_Bytes__Prototype) NewBuilder() datamodel.NodeBuilder { + var nb _Bytes__Builder + nb.Reset() + return &nb +} + +type _Bytes__Builder struct { + _Bytes__Assembler +} + +func (nb *_Bytes__Builder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_Bytes__Builder) Reset() { + var w _Bytes + var m schema.Maybe + *nb = _Bytes__Builder{_Bytes__Assembler{w: &w, m: &m}} +} + +type _Bytes__Assembler struct { + w *_Bytes + m *schema.Maybe +} + +func (na *_Bytes__Assembler) reset() {} +func (_Bytes__Assembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.BytesAssembler{TypeName: "dagjose.Bytes"}.BeginMap(0) +} +func (_Bytes__Assembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.BytesAssembler{TypeName: "dagjose.Bytes"}.BeginList(0) +} +func (na *_Bytes__Assembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.BytesAssembler{TypeName: "dagjose.Bytes"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + panic("unreachable") +} +func (_Bytes__Assembler) AssignBool(bool) error { + return mixins.BytesAssembler{TypeName: "dagjose.Bytes"}.AssignBool(false) +} +func (_Bytes__Assembler) AssignInt(int64) error { + return mixins.BytesAssembler{TypeName: "dagjose.Bytes"}.AssignInt(0) +} +func (_Bytes__Assembler) AssignFloat(float64) error { + return mixins.BytesAssembler{TypeName: "dagjose.Bytes"}.AssignFloat(0) +} +func (_Bytes__Assembler) AssignString(string) error { + return mixins.BytesAssembler{TypeName: "dagjose.Bytes"}.AssignString("") +} +func (na *_Bytes__Assembler) AssignBytes(v []byte) error { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + na.w.x = v + *na.m = schema.Maybe_Value + return nil +} +func (_Bytes__Assembler) AssignLink(datamodel.Link) error { + return mixins.BytesAssembler{TypeName: "dagjose.Bytes"}.AssignLink(nil) +} +func (na *_Bytes__Assembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_Bytes); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v2, err := v.AsBytes(); err != nil { + return err + } else { + return na.AssignBytes(v2) + } +} +func (_Bytes__Assembler) Prototype() datamodel.NodePrototype { + return _Bytes__Prototype{} +} +func (Bytes) Type() schema.Type { + return nil /*TODO:typelit*/ +} +func (n Bytes) Representation() datamodel.Node { + return (*_Bytes__Repr)(n) +} + +type _Bytes__Repr = _Bytes + +var _ datamodel.Node = &_Bytes__Repr{} + +type _Bytes__ReprPrototype = _Bytes__Prototype +type _Bytes__ReprAssembler = _Bytes__Assembler + +func (n _DecodedJOSE) FieldAad() MaybeBase64Url { + return &n.aad +} +func (n _DecodedJOSE) FieldCiphertext() MaybeBase64Url { + return &n.ciphertext +} +func (n _DecodedJOSE) FieldIv() MaybeBase64Url { + return &n.iv +} +func (n _DecodedJOSE) FieldLink() MaybeLink { + return &n.link +} +func (n _DecodedJOSE) FieldPayload() MaybeBase64Url { + return &n.payload +} +func (n _DecodedJOSE) FieldProtected() MaybeBase64Url { + return &n.protected +} +func (n _DecodedJOSE) FieldRecipients() MaybeDecodedRecipients { + return &n.recipients +} +func (n _DecodedJOSE) FieldSignatures() MaybeDecodedSignatures { + return &n.signatures +} +func (n _DecodedJOSE) FieldTag() MaybeBase64Url { + return &n.tag +} +func (n _DecodedJOSE) FieldUnprotected() MaybeAny { + return &n.unprotected +} + +type _DecodedJOSE__Maybe struct { + m schema.Maybe + v DecodedJOSE +} +type MaybeDecodedJOSE = *_DecodedJOSE__Maybe + +func (m MaybeDecodedJOSE) IsNull() bool { + return m.m == schema.Maybe_Null +} +func (m MaybeDecodedJOSE) IsAbsent() bool { + return m.m == schema.Maybe_Absent +} +func (m MaybeDecodedJOSE) Exists() bool { + return m.m == schema.Maybe_Value +} +func (m MaybeDecodedJOSE) AsNode() datamodel.Node { + switch m.m { + case schema.Maybe_Absent: + return datamodel.Absent + case schema.Maybe_Null: + return datamodel.Null + case schema.Maybe_Value: + return m.v + default: + panic("unreachable") + } +} +func (m MaybeDecodedJOSE) Must() DecodedJOSE { + if !m.Exists() { + panic("unbox of a maybe rejected") + } + return m.v +} + +var ( + fieldName__DecodedJOSE_Aad = _String{"aad"} + fieldName__DecodedJOSE_Ciphertext = _String{"ciphertext"} + fieldName__DecodedJOSE_Iv = _String{"iv"} + fieldName__DecodedJOSE_Link = _String{"link"} + fieldName__DecodedJOSE_Payload = _String{"payload"} + fieldName__DecodedJOSE_Protected = _String{"protected"} + fieldName__DecodedJOSE_Recipients = _String{"recipients"} + fieldName__DecodedJOSE_Signatures = _String{"signatures"} + fieldName__DecodedJOSE_Tag = _String{"tag"} + fieldName__DecodedJOSE_Unprotected = _String{"unprotected"} +) +var _ datamodel.Node = (DecodedJOSE)(&_DecodedJOSE{}) +var _ schema.TypedNode = (DecodedJOSE)(&_DecodedJOSE{}) + +func (DecodedJOSE) Kind() datamodel.Kind { + return datamodel.Kind_Map +} +func (n DecodedJOSE) LookupByString(key string) (datamodel.Node, error) { + switch key { + case "aad": + if n.aad.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return &n.aad.v, nil + case "ciphertext": + if n.ciphertext.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return &n.ciphertext.v, nil + case "iv": + if n.iv.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return &n.iv.v, nil + case "link": + if n.link.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return &n.link.v, nil + case "payload": + if n.payload.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return &n.payload.v, nil + case "protected": + if n.protected.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return &n.protected.v, nil + case "recipients": + if n.recipients.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return &n.recipients.v, nil + case "signatures": + if n.signatures.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return &n.signatures.v, nil + case "tag": + if n.tag.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return &n.tag.v, nil + case "unprotected": + if n.unprotected.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return n.unprotected.v, nil + default: + return nil, schema.ErrNoSuchField{Type: nil /*TODO*/, Field: datamodel.PathSegmentOfString(key)} + } +} +func (n DecodedJOSE) LookupByNode(key datamodel.Node) (datamodel.Node, error) { + ks, err := key.AsString() + if err != nil { + return nil, err + } + return n.LookupByString(ks) +} +func (DecodedJOSE) LookupByIndex(idx int64) (datamodel.Node, error) { + return mixins.Map{TypeName: "dagjose.DecodedJOSE"}.LookupByIndex(0) +} +func (n DecodedJOSE) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + return n.LookupByString(seg.String()) +} +func (n DecodedJOSE) MapIterator() datamodel.MapIterator { + return &_DecodedJOSE__MapItr{n, 0} +} + +type _DecodedJOSE__MapItr struct { + n DecodedJOSE + idx int +} + +func (itr *_DecodedJOSE__MapItr) Next() (k datamodel.Node, v datamodel.Node, _ error) { + if itr.idx >= 10 { + return nil, nil, datamodel.ErrIteratorOverread{} + } + switch itr.idx { + case 0: + k = &fieldName__DecodedJOSE_Aad + if itr.n.aad.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = &itr.n.aad.v + case 1: + k = &fieldName__DecodedJOSE_Ciphertext + if itr.n.ciphertext.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = &itr.n.ciphertext.v + case 2: + k = &fieldName__DecodedJOSE_Iv + if itr.n.iv.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = &itr.n.iv.v + case 3: + k = &fieldName__DecodedJOSE_Link + if itr.n.link.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = &itr.n.link.v + case 4: + k = &fieldName__DecodedJOSE_Payload + if itr.n.payload.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = &itr.n.payload.v + case 5: + k = &fieldName__DecodedJOSE_Protected + if itr.n.protected.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = &itr.n.protected.v + case 6: + k = &fieldName__DecodedJOSE_Recipients + if itr.n.recipients.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = &itr.n.recipients.v + case 7: + k = &fieldName__DecodedJOSE_Signatures + if itr.n.signatures.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = &itr.n.signatures.v + case 8: + k = &fieldName__DecodedJOSE_Tag + if itr.n.tag.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = &itr.n.tag.v + case 9: + k = &fieldName__DecodedJOSE_Unprotected + if itr.n.unprotected.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = itr.n.unprotected.v + default: + panic("unreachable") + } + itr.idx++ + return +} +func (itr *_DecodedJOSE__MapItr) Done() bool { + return itr.idx >= 10 +} + +func (DecodedJOSE) ListIterator() datamodel.ListIterator { + return nil +} +func (DecodedJOSE) Length() int64 { + return 10 +} +func (DecodedJOSE) IsAbsent() bool { + return false +} +func (DecodedJOSE) IsNull() bool { + return false +} +func (DecodedJOSE) AsBool() (bool, error) { + return mixins.Map{TypeName: "dagjose.DecodedJOSE"}.AsBool() +} +func (DecodedJOSE) AsInt() (int64, error) { + return mixins.Map{TypeName: "dagjose.DecodedJOSE"}.AsInt() +} +func (DecodedJOSE) AsFloat() (float64, error) { + return mixins.Map{TypeName: "dagjose.DecodedJOSE"}.AsFloat() +} +func (DecodedJOSE) AsString() (string, error) { + return mixins.Map{TypeName: "dagjose.DecodedJOSE"}.AsString() +} +func (DecodedJOSE) AsBytes() ([]byte, error) { + return mixins.Map{TypeName: "dagjose.DecodedJOSE"}.AsBytes() +} +func (DecodedJOSE) AsLink() (datamodel.Link, error) { + return mixins.Map{TypeName: "dagjose.DecodedJOSE"}.AsLink() +} +func (DecodedJOSE) Prototype() datamodel.NodePrototype { + return _DecodedJOSE__Prototype{} +} + +type _DecodedJOSE__Prototype struct{} + +func (_DecodedJOSE__Prototype) NewBuilder() datamodel.NodeBuilder { + var nb _DecodedJOSE__Builder + nb.Reset() + return &nb +} + +type _DecodedJOSE__Builder struct { + _DecodedJOSE__Assembler +} + +func (nb *_DecodedJOSE__Builder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_DecodedJOSE__Builder) Reset() { + var w _DecodedJOSE + var m schema.Maybe + *nb = _DecodedJOSE__Builder{_DecodedJOSE__Assembler{w: &w, m: &m}} +} + +type _DecodedJOSE__Assembler struct { + w *_DecodedJOSE + m *schema.Maybe + state maState + s int + f int + + cm schema.Maybe + ca_aad _Base64Url__Assembler + ca_ciphertext _Base64Url__Assembler + ca_iv _Base64Url__Assembler + ca_link _Link__Assembler + ca_payload _Base64Url__Assembler + ca_protected _Base64Url__Assembler + ca_recipients _DecodedRecipients__Assembler + ca_signatures _DecodedSignatures__Assembler + ca_tag _Base64Url__Assembler + ca_unprotected _Any__Assembler +} + +func (na *_DecodedJOSE__Assembler) reset() { + na.state = maState_initial + na.s = 0 + na.ca_aad.reset() + na.ca_ciphertext.reset() + na.ca_iv.reset() + na.ca_link.reset() + na.ca_payload.reset() + na.ca_protected.reset() + na.ca_recipients.reset() + na.ca_signatures.reset() + na.ca_tag.reset() + na.ca_unprotected.reset() +} + +var ( + fieldBit__DecodedJOSE_Aad = 1 << 0 + fieldBit__DecodedJOSE_Ciphertext = 1 << 1 + fieldBit__DecodedJOSE_Iv = 1 << 2 + fieldBit__DecodedJOSE_Link = 1 << 3 + fieldBit__DecodedJOSE_Payload = 1 << 4 + fieldBit__DecodedJOSE_Protected = 1 << 5 + fieldBit__DecodedJOSE_Recipients = 1 << 6 + fieldBit__DecodedJOSE_Signatures = 1 << 7 + fieldBit__DecodedJOSE_Tag = 1 << 8 + fieldBit__DecodedJOSE_Unprotected = 1 << 9 + fieldBits__DecodedJOSE_sufficient = 0 +) + +func (na *_DecodedJOSE__Assembler) BeginMap(int64) (datamodel.MapAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if na.w == nil { + na.w = &_DecodedJOSE{} + } + return na, nil +} +func (_DecodedJOSE__Assembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.MapAssembler{TypeName: "dagjose.DecodedJOSE"}.BeginList(0) +} +func (na *_DecodedJOSE__Assembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.MapAssembler{TypeName: "dagjose.DecodedJOSE"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_DecodedJOSE__Assembler) AssignBool(bool) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedJOSE"}.AssignBool(false) +} +func (_DecodedJOSE__Assembler) AssignInt(int64) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedJOSE"}.AssignInt(0) +} +func (_DecodedJOSE__Assembler) AssignFloat(float64) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedJOSE"}.AssignFloat(0) +} +func (_DecodedJOSE__Assembler) AssignString(string) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedJOSE"}.AssignString("") +} +func (_DecodedJOSE__Assembler) AssignBytes([]byte) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedJOSE"}.AssignBytes(nil) +} +func (_DecodedJOSE__Assembler) AssignLink(datamodel.Link) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedJOSE"}.AssignLink(nil) +} +func (na *_DecodedJOSE__Assembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_DecodedJOSE); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + if na.w == nil { + na.w = v2 + *na.m = schema.Maybe_Value + return nil + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_Map { + return datamodel.ErrWrongKind{TypeName: "dagjose.DecodedJOSE", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustMap, ActualKind: v.Kind()} + } + itr := v.MapIterator() + for !itr.Done() { + k, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleKey().AssignNode(k); err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_DecodedJOSE__Assembler) Prototype() datamodel.NodePrototype { + return _DecodedJOSE__Prototype{} +} +func (ma *_DecodedJOSE__Assembler) valueFinishTidy() bool { + switch ma.f { + case 0: + switch ma.w.aad.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 1: + switch ma.w.ciphertext.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 2: + switch ma.w.iv.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 3: + switch ma.w.link.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 4: + switch ma.w.payload.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 5: + switch ma.w.protected.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 6: + switch ma.w.recipients.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 7: + switch ma.w.signatures.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 8: + switch ma.w.tag.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 9: + switch ma.w.unprotected.m { + case schema.Maybe_Value: + ma.w.unprotected.v = ma.ca_unprotected.w + ma.state = maState_initial + return true + default: + return false + } + default: + panic("unreachable") + } +} +func (ma *_DecodedJOSE__Assembler) AssembleEntry(k string) (datamodel.NodeAssembler, error) { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleEntry cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleEntry cannot be called on an assembler that's already finished") + } + switch k { + case "aad": + if ma.s&fieldBit__DecodedJOSE_Aad != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Aad} + } + ma.s += fieldBit__DecodedJOSE_Aad + ma.state = maState_midValue + ma.f = 0 + ma.ca_aad.w = &ma.w.aad.v + ma.ca_aad.m = &ma.w.aad.m + return &ma.ca_aad, nil + case "ciphertext": + if ma.s&fieldBit__DecodedJOSE_Ciphertext != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Ciphertext} + } + ma.s += fieldBit__DecodedJOSE_Ciphertext + ma.state = maState_midValue + ma.f = 1 + ma.ca_ciphertext.w = &ma.w.ciphertext.v + ma.ca_ciphertext.m = &ma.w.ciphertext.m + return &ma.ca_ciphertext, nil + case "iv": + if ma.s&fieldBit__DecodedJOSE_Iv != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Iv} + } + ma.s += fieldBit__DecodedJOSE_Iv + ma.state = maState_midValue + ma.f = 2 + ma.ca_iv.w = &ma.w.iv.v + ma.ca_iv.m = &ma.w.iv.m + return &ma.ca_iv, nil + case "link": + if ma.s&fieldBit__DecodedJOSE_Link != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Link} + } + ma.s += fieldBit__DecodedJOSE_Link + ma.state = maState_midValue + ma.f = 3 + ma.ca_link.w = &ma.w.link.v + ma.ca_link.m = &ma.w.link.m + return &ma.ca_link, nil + case "payload": + if ma.s&fieldBit__DecodedJOSE_Payload != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Payload} + } + ma.s += fieldBit__DecodedJOSE_Payload + ma.state = maState_midValue + ma.f = 4 + ma.ca_payload.w = &ma.w.payload.v + ma.ca_payload.m = &ma.w.payload.m + return &ma.ca_payload, nil + case "protected": + if ma.s&fieldBit__DecodedJOSE_Protected != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Protected} + } + ma.s += fieldBit__DecodedJOSE_Protected + ma.state = maState_midValue + ma.f = 5 + ma.ca_protected.w = &ma.w.protected.v + ma.ca_protected.m = &ma.w.protected.m + return &ma.ca_protected, nil + case "recipients": + if ma.s&fieldBit__DecodedJOSE_Recipients != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Recipients} + } + ma.s += fieldBit__DecodedJOSE_Recipients + ma.state = maState_midValue + ma.f = 6 + ma.ca_recipients.w = &ma.w.recipients.v + ma.ca_recipients.m = &ma.w.recipients.m + return &ma.ca_recipients, nil + case "signatures": + if ma.s&fieldBit__DecodedJOSE_Signatures != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Signatures} + } + ma.s += fieldBit__DecodedJOSE_Signatures + ma.state = maState_midValue + ma.f = 7 + ma.ca_signatures.w = &ma.w.signatures.v + ma.ca_signatures.m = &ma.w.signatures.m + return &ma.ca_signatures, nil + case "tag": + if ma.s&fieldBit__DecodedJOSE_Tag != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Tag} + } + ma.s += fieldBit__DecodedJOSE_Tag + ma.state = maState_midValue + ma.f = 8 + ma.ca_tag.w = &ma.w.tag.v + ma.ca_tag.m = &ma.w.tag.m + return &ma.ca_tag, nil + case "unprotected": + if ma.s&fieldBit__DecodedJOSE_Unprotected != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Unprotected} + } + ma.s += fieldBit__DecodedJOSE_Unprotected + ma.state = maState_midValue + ma.f = 9 + ma.ca_unprotected.w = ma.w.unprotected.v + ma.ca_unprotected.m = &ma.w.unprotected.m + return &ma.ca_unprotected, nil + } + return nil, schema.ErrInvalidKey{TypeName: "dagjose.DecodedJOSE", Key: &_String{k}} +} +func (ma *_DecodedJOSE__Assembler) AssembleKey() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleKey cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleKey cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleKey cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleKey cannot be called on an assembler that's already finished") + } + ma.state = maState_midKey + return (*_DecodedJOSE__KeyAssembler)(ma) +} +func (ma *_DecodedJOSE__Assembler) AssembleValue() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + panic("invalid state: AssembleValue cannot be called when no key is primed") + case maState_midKey: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling a key") + case maState_expectValue: + // carry on + case maState_midValue: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling another value") + case maState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + ma.state = maState_midValue + switch ma.f { + case 0: + ma.ca_aad.w = &ma.w.aad.v + ma.ca_aad.m = &ma.w.aad.m + return &ma.ca_aad + case 1: + ma.ca_ciphertext.w = &ma.w.ciphertext.v + ma.ca_ciphertext.m = &ma.w.ciphertext.m + return &ma.ca_ciphertext + case 2: + ma.ca_iv.w = &ma.w.iv.v + ma.ca_iv.m = &ma.w.iv.m + return &ma.ca_iv + case 3: + ma.ca_link.w = &ma.w.link.v + ma.ca_link.m = &ma.w.link.m + return &ma.ca_link + case 4: + ma.ca_payload.w = &ma.w.payload.v + ma.ca_payload.m = &ma.w.payload.m + return &ma.ca_payload + case 5: + ma.ca_protected.w = &ma.w.protected.v + ma.ca_protected.m = &ma.w.protected.m + return &ma.ca_protected + case 6: + ma.ca_recipients.w = &ma.w.recipients.v + ma.ca_recipients.m = &ma.w.recipients.m + return &ma.ca_recipients + case 7: + ma.ca_signatures.w = &ma.w.signatures.v + ma.ca_signatures.m = &ma.w.signatures.m + return &ma.ca_signatures + case 8: + ma.ca_tag.w = &ma.w.tag.v + ma.ca_tag.m = &ma.w.tag.m + return &ma.ca_tag + case 9: + ma.ca_unprotected.w = ma.w.unprotected.v + ma.ca_unprotected.m = &ma.w.unprotected.m + return &ma.ca_unprotected + default: + panic("unreachable") + } +} +func (ma *_DecodedJOSE__Assembler) Finish() error { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: Finish cannot be called when in the middle of assembling a key") + case maState_expectValue: + panic("invalid state: Finish cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + if ma.s&fieldBits__DecodedJOSE_sufficient != fieldBits__DecodedJOSE_sufficient { + err := schema.ErrMissingRequiredField{Missing: make([]string, 0)} + return err + } + ma.state = maState_finished + *ma.m = schema.Maybe_Value + return nil +} +func (ma *_DecodedJOSE__Assembler) KeyPrototype() datamodel.NodePrototype { + return _String__Prototype{} +} +func (ma *_DecodedJOSE__Assembler) ValuePrototype(k string) datamodel.NodePrototype { + panic("todo structbuilder mapassembler valueprototype") +} + +type _DecodedJOSE__KeyAssembler _DecodedJOSE__Assembler + +func (_DecodedJOSE__KeyAssembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.DecodedJOSE.KeyAssembler"}.BeginMap(0) +} +func (_DecodedJOSE__KeyAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.DecodedJOSE.KeyAssembler"}.BeginList(0) +} +func (na *_DecodedJOSE__KeyAssembler) AssignNull() error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedJOSE.KeyAssembler"}.AssignNull() +} +func (_DecodedJOSE__KeyAssembler) AssignBool(bool) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedJOSE.KeyAssembler"}.AssignBool(false) +} +func (_DecodedJOSE__KeyAssembler) AssignInt(int64) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedJOSE.KeyAssembler"}.AssignInt(0) +} +func (_DecodedJOSE__KeyAssembler) AssignFloat(float64) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedJOSE.KeyAssembler"}.AssignFloat(0) +} +func (ka *_DecodedJOSE__KeyAssembler) AssignString(k string) error { + if ka.state != maState_midKey { + panic("misuse: KeyAssembler held beyond its valid lifetime") + } + switch k { + case "aad": + if ka.s&fieldBit__DecodedJOSE_Aad != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Aad} + } + ka.s += fieldBit__DecodedJOSE_Aad + ka.state = maState_expectValue + ka.f = 0 + return nil + case "ciphertext": + if ka.s&fieldBit__DecodedJOSE_Ciphertext != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Ciphertext} + } + ka.s += fieldBit__DecodedJOSE_Ciphertext + ka.state = maState_expectValue + ka.f = 1 + return nil + case "iv": + if ka.s&fieldBit__DecodedJOSE_Iv != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Iv} + } + ka.s += fieldBit__DecodedJOSE_Iv + ka.state = maState_expectValue + ka.f = 2 + return nil + case "link": + if ka.s&fieldBit__DecodedJOSE_Link != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Link} + } + ka.s += fieldBit__DecodedJOSE_Link + ka.state = maState_expectValue + ka.f = 3 + return nil + case "payload": + if ka.s&fieldBit__DecodedJOSE_Payload != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Payload} + } + ka.s += fieldBit__DecodedJOSE_Payload + ka.state = maState_expectValue + ka.f = 4 + return nil + case "protected": + if ka.s&fieldBit__DecodedJOSE_Protected != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Protected} + } + ka.s += fieldBit__DecodedJOSE_Protected + ka.state = maState_expectValue + ka.f = 5 + return nil + case "recipients": + if ka.s&fieldBit__DecodedJOSE_Recipients != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Recipients} + } + ka.s += fieldBit__DecodedJOSE_Recipients + ka.state = maState_expectValue + ka.f = 6 + return nil + case "signatures": + if ka.s&fieldBit__DecodedJOSE_Signatures != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Signatures} + } + ka.s += fieldBit__DecodedJOSE_Signatures + ka.state = maState_expectValue + ka.f = 7 + return nil + case "tag": + if ka.s&fieldBit__DecodedJOSE_Tag != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Tag} + } + ka.s += fieldBit__DecodedJOSE_Tag + ka.state = maState_expectValue + ka.f = 8 + return nil + case "unprotected": + if ka.s&fieldBit__DecodedJOSE_Unprotected != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Unprotected} + } + ka.s += fieldBit__DecodedJOSE_Unprotected + ka.state = maState_expectValue + ka.f = 9 + return nil + default: + return schema.ErrInvalidKey{TypeName: "dagjose.DecodedJOSE", Key: &_String{k}} + } +} +func (_DecodedJOSE__KeyAssembler) AssignBytes([]byte) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedJOSE.KeyAssembler"}.AssignBytes(nil) +} +func (_DecodedJOSE__KeyAssembler) AssignLink(datamodel.Link) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedJOSE.KeyAssembler"}.AssignLink(nil) +} +func (ka *_DecodedJOSE__KeyAssembler) AssignNode(v datamodel.Node) error { + if v2, err := v.AsString(); err != nil { + return err + } else { + return ka.AssignString(v2) + } +} +func (_DecodedJOSE__KeyAssembler) Prototype() datamodel.NodePrototype { + return _String__Prototype{} +} +func (DecodedJOSE) Type() schema.Type { + return nil /*TODO:typelit*/ +} +func (n DecodedJOSE) Representation() datamodel.Node { + return (*_DecodedJOSE__Repr)(n) +} + +type _DecodedJOSE__Repr _DecodedJOSE + +var ( + fieldName__DecodedJOSE_Aad_serial = _String{"aad"} + fieldName__DecodedJOSE_Ciphertext_serial = _String{"ciphertext"} + fieldName__DecodedJOSE_Iv_serial = _String{"iv"} + fieldName__DecodedJOSE_Link_serial = _String{"link"} + fieldName__DecodedJOSE_Payload_serial = _String{"payload"} + fieldName__DecodedJOSE_Protected_serial = _String{"protected"} + fieldName__DecodedJOSE_Recipients_serial = _String{"recipients"} + fieldName__DecodedJOSE_Signatures_serial = _String{"signatures"} + fieldName__DecodedJOSE_Tag_serial = _String{"tag"} + fieldName__DecodedJOSE_Unprotected_serial = _String{"unprotected"} +) +var _ datamodel.Node = &_DecodedJOSE__Repr{} + +func (_DecodedJOSE__Repr) Kind() datamodel.Kind { + return datamodel.Kind_Map +} +func (n *_DecodedJOSE__Repr) LookupByString(key string) (datamodel.Node, error) { + switch key { + case "aad": + if n.aad.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.aad.v.Representation(), nil + case "ciphertext": + if n.ciphertext.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.ciphertext.v.Representation(), nil + case "iv": + if n.iv.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.iv.v.Representation(), nil + case "link": + if n.link.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.link.v.Representation(), nil + case "payload": + if n.payload.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.payload.v.Representation(), nil + case "protected": + if n.protected.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.protected.v.Representation(), nil + case "recipients": + if n.recipients.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.recipients.v.Representation(), nil + case "signatures": + if n.signatures.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.signatures.v.Representation(), nil + case "tag": + if n.tag.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.tag.v.Representation(), nil + case "unprotected": + if n.unprotected.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.unprotected.v.Representation(), nil + default: + return nil, schema.ErrNoSuchField{Type: nil /*TODO*/, Field: datamodel.PathSegmentOfString(key)} + } +} +func (n *_DecodedJOSE__Repr) LookupByNode(key datamodel.Node) (datamodel.Node, error) { + ks, err := key.AsString() + if err != nil { + return nil, err + } + return n.LookupByString(ks) +} +func (_DecodedJOSE__Repr) LookupByIndex(idx int64) (datamodel.Node, error) { + return mixins.Map{TypeName: "dagjose.DecodedJOSE.Repr"}.LookupByIndex(0) +} +func (n _DecodedJOSE__Repr) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + return n.LookupByString(seg.String()) +} +func (n *_DecodedJOSE__Repr) MapIterator() datamodel.MapIterator { + end := 10 + if n.unprotected.m == schema.Maybe_Absent { + end = 9 + } else { + goto done + } + if n.tag.m == schema.Maybe_Absent { + end = 8 + } else { + goto done + } + if n.signatures.m == schema.Maybe_Absent { + end = 7 + } else { + goto done + } + if n.recipients.m == schema.Maybe_Absent { + end = 6 + } else { + goto done + } + if n.protected.m == schema.Maybe_Absent { + end = 5 + } else { + goto done + } + if n.payload.m == schema.Maybe_Absent { + end = 4 + } else { + goto done + } + if n.link.m == schema.Maybe_Absent { + end = 3 + } else { + goto done + } + if n.iv.m == schema.Maybe_Absent { + end = 2 + } else { + goto done + } + if n.ciphertext.m == schema.Maybe_Absent { + end = 1 + } else { + goto done + } + if n.aad.m == schema.Maybe_Absent { + end = 0 + } else { + goto done + } +done: + return &_DecodedJOSE__ReprMapItr{n, 0, end} +} + +type _DecodedJOSE__ReprMapItr struct { + n *_DecodedJOSE__Repr + idx int + end int +} + +func (itr *_DecodedJOSE__ReprMapItr) Next() (k datamodel.Node, v datamodel.Node, _ error) { +advance: + if itr.idx >= 10 { + return nil, nil, datamodel.ErrIteratorOverread{} + } + switch itr.idx { + case 0: + k = &fieldName__DecodedJOSE_Aad_serial + if itr.n.aad.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.aad.v.Representation() + case 1: + k = &fieldName__DecodedJOSE_Ciphertext_serial + if itr.n.ciphertext.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.ciphertext.v.Representation() + case 2: + k = &fieldName__DecodedJOSE_Iv_serial + if itr.n.iv.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.iv.v.Representation() + case 3: + k = &fieldName__DecodedJOSE_Link_serial + if itr.n.link.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.link.v.Representation() + case 4: + k = &fieldName__DecodedJOSE_Payload_serial + if itr.n.payload.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.payload.v.Representation() + case 5: + k = &fieldName__DecodedJOSE_Protected_serial + if itr.n.protected.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.protected.v.Representation() + case 6: + k = &fieldName__DecodedJOSE_Recipients_serial + if itr.n.recipients.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.recipients.v.Representation() + case 7: + k = &fieldName__DecodedJOSE_Signatures_serial + if itr.n.signatures.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.signatures.v.Representation() + case 8: + k = &fieldName__DecodedJOSE_Tag_serial + if itr.n.tag.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.tag.v.Representation() + case 9: + k = &fieldName__DecodedJOSE_Unprotected_serial + if itr.n.unprotected.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.unprotected.v.Representation() + default: + panic("unreachable") + } + itr.idx++ + return +} +func (itr *_DecodedJOSE__ReprMapItr) Done() bool { + return itr.idx >= itr.end +} +func (_DecodedJOSE__Repr) ListIterator() datamodel.ListIterator { + return nil +} +func (rn *_DecodedJOSE__Repr) Length() int64 { + l := 10 + if rn.aad.m == schema.Maybe_Absent { + l-- + } + if rn.ciphertext.m == schema.Maybe_Absent { + l-- + } + if rn.iv.m == schema.Maybe_Absent { + l-- + } + if rn.link.m == schema.Maybe_Absent { + l-- + } + if rn.payload.m == schema.Maybe_Absent { + l-- + } + if rn.protected.m == schema.Maybe_Absent { + l-- + } + if rn.recipients.m == schema.Maybe_Absent { + l-- + } + if rn.signatures.m == schema.Maybe_Absent { + l-- + } + if rn.tag.m == schema.Maybe_Absent { + l-- + } + if rn.unprotected.m == schema.Maybe_Absent { + l-- + } + return int64(l) +} +func (_DecodedJOSE__Repr) IsAbsent() bool { + return false +} +func (_DecodedJOSE__Repr) IsNull() bool { + return false +} +func (_DecodedJOSE__Repr) AsBool() (bool, error) { + return mixins.Map{TypeName: "dagjose.DecodedJOSE.Repr"}.AsBool() +} +func (_DecodedJOSE__Repr) AsInt() (int64, error) { + return mixins.Map{TypeName: "dagjose.DecodedJOSE.Repr"}.AsInt() +} +func (_DecodedJOSE__Repr) AsFloat() (float64, error) { + return mixins.Map{TypeName: "dagjose.DecodedJOSE.Repr"}.AsFloat() +} +func (_DecodedJOSE__Repr) AsString() (string, error) { + return mixins.Map{TypeName: "dagjose.DecodedJOSE.Repr"}.AsString() +} +func (_DecodedJOSE__Repr) AsBytes() ([]byte, error) { + return mixins.Map{TypeName: "dagjose.DecodedJOSE.Repr"}.AsBytes() +} +func (_DecodedJOSE__Repr) AsLink() (datamodel.Link, error) { + return mixins.Map{TypeName: "dagjose.DecodedJOSE.Repr"}.AsLink() +} +func (_DecodedJOSE__Repr) Prototype() datamodel.NodePrototype { + return _DecodedJOSE__ReprPrototype{} +} + +type _DecodedJOSE__ReprPrototype struct{} + +func (_DecodedJOSE__ReprPrototype) NewBuilder() datamodel.NodeBuilder { + var nb _DecodedJOSE__ReprBuilder + nb.Reset() + return &nb +} + +type _DecodedJOSE__ReprBuilder struct { + _DecodedJOSE__ReprAssembler +} + +func (nb *_DecodedJOSE__ReprBuilder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_DecodedJOSE__ReprBuilder) Reset() { + var w _DecodedJOSE + var m schema.Maybe + *nb = _DecodedJOSE__ReprBuilder{_DecodedJOSE__ReprAssembler{w: &w, m: &m}} +} + +type _DecodedJOSE__ReprAssembler struct { + w *_DecodedJOSE + m *schema.Maybe + state maState + s int + f int + + cm schema.Maybe + ca_aad _Base64Url__ReprAssembler + ca_ciphertext _Base64Url__ReprAssembler + ca_iv _Base64Url__ReprAssembler + ca_link _Link__ReprAssembler + ca_payload _Base64Url__ReprAssembler + ca_protected _Base64Url__ReprAssembler + ca_recipients _DecodedRecipients__ReprAssembler + ca_signatures _DecodedSignatures__ReprAssembler + ca_tag _Base64Url__ReprAssembler + ca_unprotected _Any__ReprAssembler +} + +func (na *_DecodedJOSE__ReprAssembler) reset() { + na.state = maState_initial + na.s = 0 + na.ca_aad.reset() + na.ca_ciphertext.reset() + na.ca_iv.reset() + na.ca_link.reset() + na.ca_payload.reset() + na.ca_protected.reset() + na.ca_recipients.reset() + na.ca_signatures.reset() + na.ca_tag.reset() + na.ca_unprotected.reset() +} +func (na *_DecodedJOSE__ReprAssembler) BeginMap(int64) (datamodel.MapAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if na.w == nil { + na.w = &_DecodedJOSE{} + } + return na, nil +} +func (_DecodedJOSE__ReprAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.MapAssembler{TypeName: "dagjose.DecodedJOSE.Repr"}.BeginList(0) +} +func (na *_DecodedJOSE__ReprAssembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.MapAssembler{TypeName: "dagjose.DecodedJOSE.Repr.Repr"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_DecodedJOSE__ReprAssembler) AssignBool(bool) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedJOSE.Repr"}.AssignBool(false) +} +func (_DecodedJOSE__ReprAssembler) AssignInt(int64) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedJOSE.Repr"}.AssignInt(0) +} +func (_DecodedJOSE__ReprAssembler) AssignFloat(float64) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedJOSE.Repr"}.AssignFloat(0) +} +func (_DecodedJOSE__ReprAssembler) AssignString(string) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedJOSE.Repr"}.AssignString("") +} +func (_DecodedJOSE__ReprAssembler) AssignBytes([]byte) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedJOSE.Repr"}.AssignBytes(nil) +} +func (_DecodedJOSE__ReprAssembler) AssignLink(datamodel.Link) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedJOSE.Repr"}.AssignLink(nil) +} +func (na *_DecodedJOSE__ReprAssembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_DecodedJOSE); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + if na.w == nil { + na.w = v2 + *na.m = schema.Maybe_Value + return nil + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_Map { + return datamodel.ErrWrongKind{TypeName: "dagjose.DecodedJOSE.Repr", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustMap, ActualKind: v.Kind()} + } + itr := v.MapIterator() + for !itr.Done() { + k, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleKey().AssignNode(k); err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_DecodedJOSE__ReprAssembler) Prototype() datamodel.NodePrototype { + return _DecodedJOSE__ReprPrototype{} +} +func (ma *_DecodedJOSE__ReprAssembler) valueFinishTidy() bool { + switch ma.f { + case 0: + switch ma.w.aad.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 1: + switch ma.w.ciphertext.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 2: + switch ma.w.iv.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 3: + switch ma.w.link.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 4: + switch ma.w.payload.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 5: + switch ma.w.protected.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 6: + switch ma.w.recipients.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 7: + switch ma.w.signatures.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 8: + switch ma.w.tag.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 9: + switch ma.w.unprotected.m { + case schema.Maybe_Value: + ma.w.unprotected.v = ma.ca_unprotected.w + ma.state = maState_initial + return true + default: + return false + } + default: + panic("unreachable") + } +} +func (ma *_DecodedJOSE__ReprAssembler) AssembleEntry(k string) (datamodel.NodeAssembler, error) { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleEntry cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleEntry cannot be called on an assembler that's already finished") + } + switch k { + case "aad": + if ma.s&fieldBit__DecodedJOSE_Aad != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Aad_serial} + } + ma.s += fieldBit__DecodedJOSE_Aad + ma.state = maState_midValue + ma.f = 0 + ma.ca_aad.w = &ma.w.aad.v + ma.ca_aad.m = &ma.w.aad.m + + return &ma.ca_aad, nil + case "ciphertext": + if ma.s&fieldBit__DecodedJOSE_Ciphertext != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Ciphertext_serial} + } + ma.s += fieldBit__DecodedJOSE_Ciphertext + ma.state = maState_midValue + ma.f = 1 + ma.ca_ciphertext.w = &ma.w.ciphertext.v + ma.ca_ciphertext.m = &ma.w.ciphertext.m + + return &ma.ca_ciphertext, nil + case "iv": + if ma.s&fieldBit__DecodedJOSE_Iv != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Iv_serial} + } + ma.s += fieldBit__DecodedJOSE_Iv + ma.state = maState_midValue + ma.f = 2 + ma.ca_iv.w = &ma.w.iv.v + ma.ca_iv.m = &ma.w.iv.m + + return &ma.ca_iv, nil + case "link": + if ma.s&fieldBit__DecodedJOSE_Link != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Link_serial} + } + ma.s += fieldBit__DecodedJOSE_Link + ma.state = maState_midValue + ma.f = 3 + ma.ca_link.w = &ma.w.link.v + ma.ca_link.m = &ma.w.link.m + + return &ma.ca_link, nil + case "payload": + if ma.s&fieldBit__DecodedJOSE_Payload != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Payload_serial} + } + ma.s += fieldBit__DecodedJOSE_Payload + ma.state = maState_midValue + ma.f = 4 + ma.ca_payload.w = &ma.w.payload.v + ma.ca_payload.m = &ma.w.payload.m + + return &ma.ca_payload, nil + case "protected": + if ma.s&fieldBit__DecodedJOSE_Protected != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Protected_serial} + } + ma.s += fieldBit__DecodedJOSE_Protected + ma.state = maState_midValue + ma.f = 5 + ma.ca_protected.w = &ma.w.protected.v + ma.ca_protected.m = &ma.w.protected.m + + return &ma.ca_protected, nil + case "recipients": + if ma.s&fieldBit__DecodedJOSE_Recipients != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Recipients_serial} + } + ma.s += fieldBit__DecodedJOSE_Recipients + ma.state = maState_midValue + ma.f = 6 + ma.ca_recipients.w = &ma.w.recipients.v + ma.ca_recipients.m = &ma.w.recipients.m + + return &ma.ca_recipients, nil + case "signatures": + if ma.s&fieldBit__DecodedJOSE_Signatures != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Signatures_serial} + } + ma.s += fieldBit__DecodedJOSE_Signatures + ma.state = maState_midValue + ma.f = 7 + ma.ca_signatures.w = &ma.w.signatures.v + ma.ca_signatures.m = &ma.w.signatures.m + + return &ma.ca_signatures, nil + case "tag": + if ma.s&fieldBit__DecodedJOSE_Tag != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Tag_serial} + } + ma.s += fieldBit__DecodedJOSE_Tag + ma.state = maState_midValue + ma.f = 8 + ma.ca_tag.w = &ma.w.tag.v + ma.ca_tag.m = &ma.w.tag.m + + return &ma.ca_tag, nil + case "unprotected": + if ma.s&fieldBit__DecodedJOSE_Unprotected != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Unprotected_serial} + } + ma.s += fieldBit__DecodedJOSE_Unprotected + ma.state = maState_midValue + ma.f = 9 + ma.ca_unprotected.w = ma.w.unprotected.v + ma.ca_unprotected.m = &ma.w.unprotected.m + + return &ma.ca_unprotected, nil + default: + } + return nil, schema.ErrInvalidKey{TypeName: "dagjose.DecodedJOSE.Repr", Key: &_String{k}} +} +func (ma *_DecodedJOSE__ReprAssembler) AssembleKey() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleKey cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleKey cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleKey cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleKey cannot be called on an assembler that's already finished") + } + ma.state = maState_midKey + return (*_DecodedJOSE__ReprKeyAssembler)(ma) +} +func (ma *_DecodedJOSE__ReprAssembler) AssembleValue() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + panic("invalid state: AssembleValue cannot be called when no key is primed") + case maState_midKey: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling a key") + case maState_expectValue: + // carry on + case maState_midValue: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling another value") + case maState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + ma.state = maState_midValue + switch ma.f { + case 0: + ma.ca_aad.w = &ma.w.aad.v + ma.ca_aad.m = &ma.w.aad.m + + return &ma.ca_aad + case 1: + ma.ca_ciphertext.w = &ma.w.ciphertext.v + ma.ca_ciphertext.m = &ma.w.ciphertext.m + + return &ma.ca_ciphertext + case 2: + ma.ca_iv.w = &ma.w.iv.v + ma.ca_iv.m = &ma.w.iv.m + + return &ma.ca_iv + case 3: + ma.ca_link.w = &ma.w.link.v + ma.ca_link.m = &ma.w.link.m + + return &ma.ca_link + case 4: + ma.ca_payload.w = &ma.w.payload.v + ma.ca_payload.m = &ma.w.payload.m + + return &ma.ca_payload + case 5: + ma.ca_protected.w = &ma.w.protected.v + ma.ca_protected.m = &ma.w.protected.m + + return &ma.ca_protected + case 6: + ma.ca_recipients.w = &ma.w.recipients.v + ma.ca_recipients.m = &ma.w.recipients.m + + return &ma.ca_recipients + case 7: + ma.ca_signatures.w = &ma.w.signatures.v + ma.ca_signatures.m = &ma.w.signatures.m + + return &ma.ca_signatures + case 8: + ma.ca_tag.w = &ma.w.tag.v + ma.ca_tag.m = &ma.w.tag.m + + return &ma.ca_tag + case 9: + ma.ca_unprotected.w = ma.w.unprotected.v + ma.ca_unprotected.m = &ma.w.unprotected.m + + return &ma.ca_unprotected + default: + panic("unreachable") + } +} +func (ma *_DecodedJOSE__ReprAssembler) Finish() error { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: Finish cannot be called when in the middle of assembling a key") + case maState_expectValue: + panic("invalid state: Finish cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + if ma.s&fieldBits__DecodedJOSE_sufficient != fieldBits__DecodedJOSE_sufficient { + err := schema.ErrMissingRequiredField{Missing: make([]string, 0)} + return err + } + ma.state = maState_finished + *ma.m = schema.Maybe_Value + return nil +} +func (ma *_DecodedJOSE__ReprAssembler) KeyPrototype() datamodel.NodePrototype { + return _String__Prototype{} +} +func (ma *_DecodedJOSE__ReprAssembler) ValuePrototype(k string) datamodel.NodePrototype { + panic("todo structbuilder mapassembler repr valueprototype") +} + +type _DecodedJOSE__ReprKeyAssembler _DecodedJOSE__ReprAssembler + +func (_DecodedJOSE__ReprKeyAssembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.DecodedJOSE.Repr.KeyAssembler"}.BeginMap(0) +} +func (_DecodedJOSE__ReprKeyAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.DecodedJOSE.Repr.KeyAssembler"}.BeginList(0) +} +func (na *_DecodedJOSE__ReprKeyAssembler) AssignNull() error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedJOSE.Repr.KeyAssembler"}.AssignNull() +} +func (_DecodedJOSE__ReprKeyAssembler) AssignBool(bool) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedJOSE.Repr.KeyAssembler"}.AssignBool(false) +} +func (_DecodedJOSE__ReprKeyAssembler) AssignInt(int64) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedJOSE.Repr.KeyAssembler"}.AssignInt(0) +} +func (_DecodedJOSE__ReprKeyAssembler) AssignFloat(float64) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedJOSE.Repr.KeyAssembler"}.AssignFloat(0) +} +func (ka *_DecodedJOSE__ReprKeyAssembler) AssignString(k string) error { + if ka.state != maState_midKey { + panic("misuse: KeyAssembler held beyond its valid lifetime") + } + switch k { + case "aad": + if ka.s&fieldBit__DecodedJOSE_Aad != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Aad_serial} + } + ka.s += fieldBit__DecodedJOSE_Aad + ka.state = maState_expectValue + ka.f = 0 + return nil + case "ciphertext": + if ka.s&fieldBit__DecodedJOSE_Ciphertext != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Ciphertext_serial} + } + ka.s += fieldBit__DecodedJOSE_Ciphertext + ka.state = maState_expectValue + ka.f = 1 + return nil + case "iv": + if ka.s&fieldBit__DecodedJOSE_Iv != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Iv_serial} + } + ka.s += fieldBit__DecodedJOSE_Iv + ka.state = maState_expectValue + ka.f = 2 + return nil + case "link": + if ka.s&fieldBit__DecodedJOSE_Link != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Link_serial} + } + ka.s += fieldBit__DecodedJOSE_Link + ka.state = maState_expectValue + ka.f = 3 + return nil + case "payload": + if ka.s&fieldBit__DecodedJOSE_Payload != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Payload_serial} + } + ka.s += fieldBit__DecodedJOSE_Payload + ka.state = maState_expectValue + ka.f = 4 + return nil + case "protected": + if ka.s&fieldBit__DecodedJOSE_Protected != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Protected_serial} + } + ka.s += fieldBit__DecodedJOSE_Protected + ka.state = maState_expectValue + ka.f = 5 + return nil + case "recipients": + if ka.s&fieldBit__DecodedJOSE_Recipients != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Recipients_serial} + } + ka.s += fieldBit__DecodedJOSE_Recipients + ka.state = maState_expectValue + ka.f = 6 + return nil + case "signatures": + if ka.s&fieldBit__DecodedJOSE_Signatures != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Signatures_serial} + } + ka.s += fieldBit__DecodedJOSE_Signatures + ka.state = maState_expectValue + ka.f = 7 + return nil + case "tag": + if ka.s&fieldBit__DecodedJOSE_Tag != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Tag_serial} + } + ka.s += fieldBit__DecodedJOSE_Tag + ka.state = maState_expectValue + ka.f = 8 + return nil + case "unprotected": + if ka.s&fieldBit__DecodedJOSE_Unprotected != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedJOSE_Unprotected_serial} + } + ka.s += fieldBit__DecodedJOSE_Unprotected + ka.state = maState_expectValue + ka.f = 9 + return nil + } + return schema.ErrInvalidKey{TypeName: "dagjose.DecodedJOSE.Repr", Key: &_String{k}} +} +func (_DecodedJOSE__ReprKeyAssembler) AssignBytes([]byte) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedJOSE.Repr.KeyAssembler"}.AssignBytes(nil) +} +func (_DecodedJOSE__ReprKeyAssembler) AssignLink(datamodel.Link) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedJOSE.Repr.KeyAssembler"}.AssignLink(nil) +} +func (ka *_DecodedJOSE__ReprKeyAssembler) AssignNode(v datamodel.Node) error { + if v2, err := v.AsString(); err != nil { + return err + } else { + return ka.AssignString(v2) + } +} +func (_DecodedJOSE__ReprKeyAssembler) Prototype() datamodel.NodePrototype { + return _String__Prototype{} +} + +func (n _DecodedRecipient) FieldHeader() MaybeAny { + return &n.header +} +func (n _DecodedRecipient) FieldEncrypted_key() MaybeBase64Url { + return &n.encrypted_key +} + +type _DecodedRecipient__Maybe struct { + m schema.Maybe + v DecodedRecipient +} +type MaybeDecodedRecipient = *_DecodedRecipient__Maybe + +func (m MaybeDecodedRecipient) IsNull() bool { + return m.m == schema.Maybe_Null +} +func (m MaybeDecodedRecipient) IsAbsent() bool { + return m.m == schema.Maybe_Absent +} +func (m MaybeDecodedRecipient) Exists() bool { + return m.m == schema.Maybe_Value +} +func (m MaybeDecodedRecipient) AsNode() datamodel.Node { + switch m.m { + case schema.Maybe_Absent: + return datamodel.Absent + case schema.Maybe_Null: + return datamodel.Null + case schema.Maybe_Value: + return m.v + default: + panic("unreachable") + } +} +func (m MaybeDecodedRecipient) Must() DecodedRecipient { + if !m.Exists() { + panic("unbox of a maybe rejected") + } + return m.v +} + +var ( + fieldName__DecodedRecipient_Header = _String{"header"} + fieldName__DecodedRecipient_Encrypted_key = _String{"encrypted_key"} +) +var _ datamodel.Node = (DecodedRecipient)(&_DecodedRecipient{}) +var _ schema.TypedNode = (DecodedRecipient)(&_DecodedRecipient{}) + +func (DecodedRecipient) Kind() datamodel.Kind { + return datamodel.Kind_Map +} +func (n DecodedRecipient) LookupByString(key string) (datamodel.Node, error) { + switch key { + case "header": + if n.header.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return n.header.v, nil + case "encrypted_key": + if n.encrypted_key.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return &n.encrypted_key.v, nil + default: + return nil, schema.ErrNoSuchField{Type: nil /*TODO*/, Field: datamodel.PathSegmentOfString(key)} + } +} +func (n DecodedRecipient) LookupByNode(key datamodel.Node) (datamodel.Node, error) { + ks, err := key.AsString() + if err != nil { + return nil, err + } + return n.LookupByString(ks) +} +func (DecodedRecipient) LookupByIndex(idx int64) (datamodel.Node, error) { + return mixins.Map{TypeName: "dagjose.DecodedRecipient"}.LookupByIndex(0) +} +func (n DecodedRecipient) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + return n.LookupByString(seg.String()) +} +func (n DecodedRecipient) MapIterator() datamodel.MapIterator { + return &_DecodedRecipient__MapItr{n, 0} +} + +type _DecodedRecipient__MapItr struct { + n DecodedRecipient + idx int +} + +func (itr *_DecodedRecipient__MapItr) Next() (k datamodel.Node, v datamodel.Node, _ error) { + if itr.idx >= 2 { + return nil, nil, datamodel.ErrIteratorOverread{} + } + switch itr.idx { + case 0: + k = &fieldName__DecodedRecipient_Header + if itr.n.header.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = itr.n.header.v + case 1: + k = &fieldName__DecodedRecipient_Encrypted_key + if itr.n.encrypted_key.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = &itr.n.encrypted_key.v + default: + panic("unreachable") + } + itr.idx++ + return +} +func (itr *_DecodedRecipient__MapItr) Done() bool { + return itr.idx >= 2 +} + +func (DecodedRecipient) ListIterator() datamodel.ListIterator { + return nil +} +func (DecodedRecipient) Length() int64 { + return 2 +} +func (DecodedRecipient) IsAbsent() bool { + return false +} +func (DecodedRecipient) IsNull() bool { + return false +} +func (DecodedRecipient) AsBool() (bool, error) { + return mixins.Map{TypeName: "dagjose.DecodedRecipient"}.AsBool() +} +func (DecodedRecipient) AsInt() (int64, error) { + return mixins.Map{TypeName: "dagjose.DecodedRecipient"}.AsInt() +} +func (DecodedRecipient) AsFloat() (float64, error) { + return mixins.Map{TypeName: "dagjose.DecodedRecipient"}.AsFloat() +} +func (DecodedRecipient) AsString() (string, error) { + return mixins.Map{TypeName: "dagjose.DecodedRecipient"}.AsString() +} +func (DecodedRecipient) AsBytes() ([]byte, error) { + return mixins.Map{TypeName: "dagjose.DecodedRecipient"}.AsBytes() +} +func (DecodedRecipient) AsLink() (datamodel.Link, error) { + return mixins.Map{TypeName: "dagjose.DecodedRecipient"}.AsLink() +} +func (DecodedRecipient) Prototype() datamodel.NodePrototype { + return _DecodedRecipient__Prototype{} +} + +type _DecodedRecipient__Prototype struct{} + +func (_DecodedRecipient__Prototype) NewBuilder() datamodel.NodeBuilder { + var nb _DecodedRecipient__Builder + nb.Reset() + return &nb +} + +type _DecodedRecipient__Builder struct { + _DecodedRecipient__Assembler +} + +func (nb *_DecodedRecipient__Builder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_DecodedRecipient__Builder) Reset() { + var w _DecodedRecipient + var m schema.Maybe + *nb = _DecodedRecipient__Builder{_DecodedRecipient__Assembler{w: &w, m: &m}} +} + +type _DecodedRecipient__Assembler struct { + w *_DecodedRecipient + m *schema.Maybe + state maState + s int + f int + + cm schema.Maybe + ca_header _Any__Assembler + ca_encrypted_key _Base64Url__Assembler +} + +func (na *_DecodedRecipient__Assembler) reset() { + na.state = maState_initial + na.s = 0 + na.ca_header.reset() + na.ca_encrypted_key.reset() +} + +var ( + fieldBit__DecodedRecipient_Header = 1 << 0 + fieldBit__DecodedRecipient_Encrypted_key = 1 << 1 + fieldBits__DecodedRecipient_sufficient = 0 +) + +func (na *_DecodedRecipient__Assembler) BeginMap(int64) (datamodel.MapAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if na.w == nil { + na.w = &_DecodedRecipient{} + } + return na, nil +} +func (_DecodedRecipient__Assembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.MapAssembler{TypeName: "dagjose.DecodedRecipient"}.BeginList(0) +} +func (na *_DecodedRecipient__Assembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.MapAssembler{TypeName: "dagjose.DecodedRecipient"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_DecodedRecipient__Assembler) AssignBool(bool) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedRecipient"}.AssignBool(false) +} +func (_DecodedRecipient__Assembler) AssignInt(int64) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedRecipient"}.AssignInt(0) +} +func (_DecodedRecipient__Assembler) AssignFloat(float64) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedRecipient"}.AssignFloat(0) +} +func (_DecodedRecipient__Assembler) AssignString(string) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedRecipient"}.AssignString("") +} +func (_DecodedRecipient__Assembler) AssignBytes([]byte) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedRecipient"}.AssignBytes(nil) +} +func (_DecodedRecipient__Assembler) AssignLink(datamodel.Link) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedRecipient"}.AssignLink(nil) +} +func (na *_DecodedRecipient__Assembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_DecodedRecipient); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + if na.w == nil { + na.w = v2 + *na.m = schema.Maybe_Value + return nil + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_Map { + return datamodel.ErrWrongKind{TypeName: "dagjose.DecodedRecipient", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustMap, ActualKind: v.Kind()} + } + itr := v.MapIterator() + for !itr.Done() { + k, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleKey().AssignNode(k); err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_DecodedRecipient__Assembler) Prototype() datamodel.NodePrototype { + return _DecodedRecipient__Prototype{} +} +func (ma *_DecodedRecipient__Assembler) valueFinishTidy() bool { + switch ma.f { + case 0: + switch ma.w.header.m { + case schema.Maybe_Value: + ma.w.header.v = ma.ca_header.w + ma.state = maState_initial + return true + default: + return false + } + case 1: + switch ma.w.encrypted_key.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + default: + panic("unreachable") + } +} +func (ma *_DecodedRecipient__Assembler) AssembleEntry(k string) (datamodel.NodeAssembler, error) { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleEntry cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleEntry cannot be called on an assembler that's already finished") + } + switch k { + case "header": + if ma.s&fieldBit__DecodedRecipient_Header != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedRecipient_Header} + } + ma.s += fieldBit__DecodedRecipient_Header + ma.state = maState_midValue + ma.f = 0 + ma.ca_header.w = ma.w.header.v + ma.ca_header.m = &ma.w.header.m + return &ma.ca_header, nil + case "encrypted_key": + if ma.s&fieldBit__DecodedRecipient_Encrypted_key != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedRecipient_Encrypted_key} + } + ma.s += fieldBit__DecodedRecipient_Encrypted_key + ma.state = maState_midValue + ma.f = 1 + ma.ca_encrypted_key.w = &ma.w.encrypted_key.v + ma.ca_encrypted_key.m = &ma.w.encrypted_key.m + return &ma.ca_encrypted_key, nil + } + return nil, schema.ErrInvalidKey{TypeName: "dagjose.DecodedRecipient", Key: &_String{k}} +} +func (ma *_DecodedRecipient__Assembler) AssembleKey() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleKey cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleKey cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleKey cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleKey cannot be called on an assembler that's already finished") + } + ma.state = maState_midKey + return (*_DecodedRecipient__KeyAssembler)(ma) +} +func (ma *_DecodedRecipient__Assembler) AssembleValue() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + panic("invalid state: AssembleValue cannot be called when no key is primed") + case maState_midKey: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling a key") + case maState_expectValue: + // carry on + case maState_midValue: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling another value") + case maState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + ma.state = maState_midValue + switch ma.f { + case 0: + ma.ca_header.w = ma.w.header.v + ma.ca_header.m = &ma.w.header.m + return &ma.ca_header + case 1: + ma.ca_encrypted_key.w = &ma.w.encrypted_key.v + ma.ca_encrypted_key.m = &ma.w.encrypted_key.m + return &ma.ca_encrypted_key + default: + panic("unreachable") + } +} +func (ma *_DecodedRecipient__Assembler) Finish() error { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: Finish cannot be called when in the middle of assembling a key") + case maState_expectValue: + panic("invalid state: Finish cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + if ma.s&fieldBits__DecodedRecipient_sufficient != fieldBits__DecodedRecipient_sufficient { + err := schema.ErrMissingRequiredField{Missing: make([]string, 0)} + return err + } + ma.state = maState_finished + *ma.m = schema.Maybe_Value + return nil +} +func (ma *_DecodedRecipient__Assembler) KeyPrototype() datamodel.NodePrototype { + return _String__Prototype{} +} +func (ma *_DecodedRecipient__Assembler) ValuePrototype(k string) datamodel.NodePrototype { + panic("todo structbuilder mapassembler valueprototype") +} + +type _DecodedRecipient__KeyAssembler _DecodedRecipient__Assembler + +func (_DecodedRecipient__KeyAssembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.DecodedRecipient.KeyAssembler"}.BeginMap(0) +} +func (_DecodedRecipient__KeyAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.DecodedRecipient.KeyAssembler"}.BeginList(0) +} +func (na *_DecodedRecipient__KeyAssembler) AssignNull() error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedRecipient.KeyAssembler"}.AssignNull() +} +func (_DecodedRecipient__KeyAssembler) AssignBool(bool) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedRecipient.KeyAssembler"}.AssignBool(false) +} +func (_DecodedRecipient__KeyAssembler) AssignInt(int64) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedRecipient.KeyAssembler"}.AssignInt(0) +} +func (_DecodedRecipient__KeyAssembler) AssignFloat(float64) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedRecipient.KeyAssembler"}.AssignFloat(0) +} +func (ka *_DecodedRecipient__KeyAssembler) AssignString(k string) error { + if ka.state != maState_midKey { + panic("misuse: KeyAssembler held beyond its valid lifetime") + } + switch k { + case "header": + if ka.s&fieldBit__DecodedRecipient_Header != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedRecipient_Header} + } + ka.s += fieldBit__DecodedRecipient_Header + ka.state = maState_expectValue + ka.f = 0 + return nil + case "encrypted_key": + if ka.s&fieldBit__DecodedRecipient_Encrypted_key != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedRecipient_Encrypted_key} + } + ka.s += fieldBit__DecodedRecipient_Encrypted_key + ka.state = maState_expectValue + ka.f = 1 + return nil + default: + return schema.ErrInvalidKey{TypeName: "dagjose.DecodedRecipient", Key: &_String{k}} + } +} +func (_DecodedRecipient__KeyAssembler) AssignBytes([]byte) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedRecipient.KeyAssembler"}.AssignBytes(nil) +} +func (_DecodedRecipient__KeyAssembler) AssignLink(datamodel.Link) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedRecipient.KeyAssembler"}.AssignLink(nil) +} +func (ka *_DecodedRecipient__KeyAssembler) AssignNode(v datamodel.Node) error { + if v2, err := v.AsString(); err != nil { + return err + } else { + return ka.AssignString(v2) + } +} +func (_DecodedRecipient__KeyAssembler) Prototype() datamodel.NodePrototype { + return _String__Prototype{} +} +func (DecodedRecipient) Type() schema.Type { + return nil /*TODO:typelit*/ +} +func (n DecodedRecipient) Representation() datamodel.Node { + return (*_DecodedRecipient__Repr)(n) +} + +type _DecodedRecipient__Repr _DecodedRecipient + +var ( + fieldName__DecodedRecipient_Header_serial = _String{"header"} + fieldName__DecodedRecipient_Encrypted_key_serial = _String{"encrypted_key"} +) +var _ datamodel.Node = &_DecodedRecipient__Repr{} + +func (_DecodedRecipient__Repr) Kind() datamodel.Kind { + return datamodel.Kind_Map +} +func (n *_DecodedRecipient__Repr) LookupByString(key string) (datamodel.Node, error) { + switch key { + case "header": + if n.header.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.header.v.Representation(), nil + case "encrypted_key": + if n.encrypted_key.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.encrypted_key.v.Representation(), nil + default: + return nil, schema.ErrNoSuchField{Type: nil /*TODO*/, Field: datamodel.PathSegmentOfString(key)} + } +} +func (n *_DecodedRecipient__Repr) LookupByNode(key datamodel.Node) (datamodel.Node, error) { + ks, err := key.AsString() + if err != nil { + return nil, err + } + return n.LookupByString(ks) +} +func (_DecodedRecipient__Repr) LookupByIndex(idx int64) (datamodel.Node, error) { + return mixins.Map{TypeName: "dagjose.DecodedRecipient.Repr"}.LookupByIndex(0) +} +func (n _DecodedRecipient__Repr) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + return n.LookupByString(seg.String()) +} +func (n *_DecodedRecipient__Repr) MapIterator() datamodel.MapIterator { + end := 2 + if n.encrypted_key.m == schema.Maybe_Absent { + end = 1 + } else { + goto done + } + if n.header.m == schema.Maybe_Absent { + end = 0 + } else { + goto done + } +done: + return &_DecodedRecipient__ReprMapItr{n, 0, end} +} + +type _DecodedRecipient__ReprMapItr struct { + n *_DecodedRecipient__Repr + idx int + end int +} + +func (itr *_DecodedRecipient__ReprMapItr) Next() (k datamodel.Node, v datamodel.Node, _ error) { +advance: + if itr.idx >= 2 { + return nil, nil, datamodel.ErrIteratorOverread{} + } + switch itr.idx { + case 0: + k = &fieldName__DecodedRecipient_Header_serial + if itr.n.header.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.header.v.Representation() + case 1: + k = &fieldName__DecodedRecipient_Encrypted_key_serial + if itr.n.encrypted_key.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.encrypted_key.v.Representation() + default: + panic("unreachable") + } + itr.idx++ + return +} +func (itr *_DecodedRecipient__ReprMapItr) Done() bool { + return itr.idx >= itr.end +} +func (_DecodedRecipient__Repr) ListIterator() datamodel.ListIterator { + return nil +} +func (rn *_DecodedRecipient__Repr) Length() int64 { + l := 2 + if rn.header.m == schema.Maybe_Absent { + l-- + } + if rn.encrypted_key.m == schema.Maybe_Absent { + l-- + } + return int64(l) +} +func (_DecodedRecipient__Repr) IsAbsent() bool { + return false +} +func (_DecodedRecipient__Repr) IsNull() bool { + return false +} +func (_DecodedRecipient__Repr) AsBool() (bool, error) { + return mixins.Map{TypeName: "dagjose.DecodedRecipient.Repr"}.AsBool() +} +func (_DecodedRecipient__Repr) AsInt() (int64, error) { + return mixins.Map{TypeName: "dagjose.DecodedRecipient.Repr"}.AsInt() +} +func (_DecodedRecipient__Repr) AsFloat() (float64, error) { + return mixins.Map{TypeName: "dagjose.DecodedRecipient.Repr"}.AsFloat() +} +func (_DecodedRecipient__Repr) AsString() (string, error) { + return mixins.Map{TypeName: "dagjose.DecodedRecipient.Repr"}.AsString() +} +func (_DecodedRecipient__Repr) AsBytes() ([]byte, error) { + return mixins.Map{TypeName: "dagjose.DecodedRecipient.Repr"}.AsBytes() +} +func (_DecodedRecipient__Repr) AsLink() (datamodel.Link, error) { + return mixins.Map{TypeName: "dagjose.DecodedRecipient.Repr"}.AsLink() +} +func (_DecodedRecipient__Repr) Prototype() datamodel.NodePrototype { + return _DecodedRecipient__ReprPrototype{} +} + +type _DecodedRecipient__ReprPrototype struct{} + +func (_DecodedRecipient__ReprPrototype) NewBuilder() datamodel.NodeBuilder { + var nb _DecodedRecipient__ReprBuilder + nb.Reset() + return &nb +} + +type _DecodedRecipient__ReprBuilder struct { + _DecodedRecipient__ReprAssembler +} + +func (nb *_DecodedRecipient__ReprBuilder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_DecodedRecipient__ReprBuilder) Reset() { + var w _DecodedRecipient + var m schema.Maybe + *nb = _DecodedRecipient__ReprBuilder{_DecodedRecipient__ReprAssembler{w: &w, m: &m}} +} + +type _DecodedRecipient__ReprAssembler struct { + w *_DecodedRecipient + m *schema.Maybe + state maState + s int + f int + + cm schema.Maybe + ca_header _Any__ReprAssembler + ca_encrypted_key _Base64Url__ReprAssembler +} + +func (na *_DecodedRecipient__ReprAssembler) reset() { + na.state = maState_initial + na.s = 0 + na.ca_header.reset() + na.ca_encrypted_key.reset() +} +func (na *_DecodedRecipient__ReprAssembler) BeginMap(int64) (datamodel.MapAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if na.w == nil { + na.w = &_DecodedRecipient{} + } + return na, nil +} +func (_DecodedRecipient__ReprAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.MapAssembler{TypeName: "dagjose.DecodedRecipient.Repr"}.BeginList(0) +} +func (na *_DecodedRecipient__ReprAssembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.MapAssembler{TypeName: "dagjose.DecodedRecipient.Repr.Repr"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_DecodedRecipient__ReprAssembler) AssignBool(bool) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedRecipient.Repr"}.AssignBool(false) +} +func (_DecodedRecipient__ReprAssembler) AssignInt(int64) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedRecipient.Repr"}.AssignInt(0) +} +func (_DecodedRecipient__ReprAssembler) AssignFloat(float64) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedRecipient.Repr"}.AssignFloat(0) +} +func (_DecodedRecipient__ReprAssembler) AssignString(string) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedRecipient.Repr"}.AssignString("") +} +func (_DecodedRecipient__ReprAssembler) AssignBytes([]byte) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedRecipient.Repr"}.AssignBytes(nil) +} +func (_DecodedRecipient__ReprAssembler) AssignLink(datamodel.Link) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedRecipient.Repr"}.AssignLink(nil) +} +func (na *_DecodedRecipient__ReprAssembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_DecodedRecipient); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + if na.w == nil { + na.w = v2 + *na.m = schema.Maybe_Value + return nil + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_Map { + return datamodel.ErrWrongKind{TypeName: "dagjose.DecodedRecipient.Repr", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustMap, ActualKind: v.Kind()} + } + itr := v.MapIterator() + for !itr.Done() { + k, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleKey().AssignNode(k); err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_DecodedRecipient__ReprAssembler) Prototype() datamodel.NodePrototype { + return _DecodedRecipient__ReprPrototype{} +} +func (ma *_DecodedRecipient__ReprAssembler) valueFinishTidy() bool { + switch ma.f { + case 0: + switch ma.w.header.m { + case schema.Maybe_Value: + ma.w.header.v = ma.ca_header.w + ma.state = maState_initial + return true + default: + return false + } + case 1: + switch ma.w.encrypted_key.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + default: + panic("unreachable") + } +} +func (ma *_DecodedRecipient__ReprAssembler) AssembleEntry(k string) (datamodel.NodeAssembler, error) { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleEntry cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleEntry cannot be called on an assembler that's already finished") + } + switch k { + case "header": + if ma.s&fieldBit__DecodedRecipient_Header != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedRecipient_Header_serial} + } + ma.s += fieldBit__DecodedRecipient_Header + ma.state = maState_midValue + ma.f = 0 + ma.ca_header.w = ma.w.header.v + ma.ca_header.m = &ma.w.header.m + + return &ma.ca_header, nil + case "encrypted_key": + if ma.s&fieldBit__DecodedRecipient_Encrypted_key != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedRecipient_Encrypted_key_serial} + } + ma.s += fieldBit__DecodedRecipient_Encrypted_key + ma.state = maState_midValue + ma.f = 1 + ma.ca_encrypted_key.w = &ma.w.encrypted_key.v + ma.ca_encrypted_key.m = &ma.w.encrypted_key.m + + return &ma.ca_encrypted_key, nil + default: + } + return nil, schema.ErrInvalidKey{TypeName: "dagjose.DecodedRecipient.Repr", Key: &_String{k}} +} +func (ma *_DecodedRecipient__ReprAssembler) AssembleKey() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleKey cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleKey cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleKey cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleKey cannot be called on an assembler that's already finished") + } + ma.state = maState_midKey + return (*_DecodedRecipient__ReprKeyAssembler)(ma) +} +func (ma *_DecodedRecipient__ReprAssembler) AssembleValue() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + panic("invalid state: AssembleValue cannot be called when no key is primed") + case maState_midKey: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling a key") + case maState_expectValue: + // carry on + case maState_midValue: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling another value") + case maState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + ma.state = maState_midValue + switch ma.f { + case 0: + ma.ca_header.w = ma.w.header.v + ma.ca_header.m = &ma.w.header.m + + return &ma.ca_header + case 1: + ma.ca_encrypted_key.w = &ma.w.encrypted_key.v + ma.ca_encrypted_key.m = &ma.w.encrypted_key.m + + return &ma.ca_encrypted_key + default: + panic("unreachable") + } +} +func (ma *_DecodedRecipient__ReprAssembler) Finish() error { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: Finish cannot be called when in the middle of assembling a key") + case maState_expectValue: + panic("invalid state: Finish cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + if ma.s&fieldBits__DecodedRecipient_sufficient != fieldBits__DecodedRecipient_sufficient { + err := schema.ErrMissingRequiredField{Missing: make([]string, 0)} + return err + } + ma.state = maState_finished + *ma.m = schema.Maybe_Value + return nil +} +func (ma *_DecodedRecipient__ReprAssembler) KeyPrototype() datamodel.NodePrototype { + return _String__Prototype{} +} +func (ma *_DecodedRecipient__ReprAssembler) ValuePrototype(k string) datamodel.NodePrototype { + panic("todo structbuilder mapassembler repr valueprototype") +} + +type _DecodedRecipient__ReprKeyAssembler _DecodedRecipient__ReprAssembler + +func (_DecodedRecipient__ReprKeyAssembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.DecodedRecipient.Repr.KeyAssembler"}.BeginMap(0) +} +func (_DecodedRecipient__ReprKeyAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.DecodedRecipient.Repr.KeyAssembler"}.BeginList(0) +} +func (na *_DecodedRecipient__ReprKeyAssembler) AssignNull() error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedRecipient.Repr.KeyAssembler"}.AssignNull() +} +func (_DecodedRecipient__ReprKeyAssembler) AssignBool(bool) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedRecipient.Repr.KeyAssembler"}.AssignBool(false) +} +func (_DecodedRecipient__ReprKeyAssembler) AssignInt(int64) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedRecipient.Repr.KeyAssembler"}.AssignInt(0) +} +func (_DecodedRecipient__ReprKeyAssembler) AssignFloat(float64) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedRecipient.Repr.KeyAssembler"}.AssignFloat(0) +} +func (ka *_DecodedRecipient__ReprKeyAssembler) AssignString(k string) error { + if ka.state != maState_midKey { + panic("misuse: KeyAssembler held beyond its valid lifetime") + } + switch k { + case "header": + if ka.s&fieldBit__DecodedRecipient_Header != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedRecipient_Header_serial} + } + ka.s += fieldBit__DecodedRecipient_Header + ka.state = maState_expectValue + ka.f = 0 + return nil + case "encrypted_key": + if ka.s&fieldBit__DecodedRecipient_Encrypted_key != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedRecipient_Encrypted_key_serial} + } + ka.s += fieldBit__DecodedRecipient_Encrypted_key + ka.state = maState_expectValue + ka.f = 1 + return nil + } + return schema.ErrInvalidKey{TypeName: "dagjose.DecodedRecipient.Repr", Key: &_String{k}} +} +func (_DecodedRecipient__ReprKeyAssembler) AssignBytes([]byte) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedRecipient.Repr.KeyAssembler"}.AssignBytes(nil) +} +func (_DecodedRecipient__ReprKeyAssembler) AssignLink(datamodel.Link) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedRecipient.Repr.KeyAssembler"}.AssignLink(nil) +} +func (ka *_DecodedRecipient__ReprKeyAssembler) AssignNode(v datamodel.Node) error { + if v2, err := v.AsString(); err != nil { + return err + } else { + return ka.AssignString(v2) + } +} +func (_DecodedRecipient__ReprKeyAssembler) Prototype() datamodel.NodePrototype { + return _String__Prototype{} +} + +func (n *_DecodedRecipients) Lookup(idx int64) DecodedRecipient { + if n.Length() <= idx { + return nil + } + v := &n.x[idx] + return v +} +func (n *_DecodedRecipients) LookupMaybe(idx int64) MaybeDecodedRecipient { + if n.Length() <= idx { + return nil + } + v := &n.x[idx] + return &_DecodedRecipient__Maybe{ + m: schema.Maybe_Value, + v: v, + } +} + +var _DecodedRecipients__valueAbsent = _DecodedRecipient__Maybe{m: schema.Maybe_Absent} + +func (n DecodedRecipients) Iterator() *DecodedRecipients__Itr { + return &DecodedRecipients__Itr{n, 0} +} + +type DecodedRecipients__Itr struct { + n DecodedRecipients + idx int +} + +func (itr *DecodedRecipients__Itr) Next() (idx int64, v DecodedRecipient) { + if itr.idx >= len(itr.n.x) { + return -1, nil + } + idx = int64(itr.idx) + v = &itr.n.x[itr.idx] + itr.idx++ + return +} +func (itr *DecodedRecipients__Itr) Done() bool { + return itr.idx >= len(itr.n.x) +} + +type _DecodedRecipients__Maybe struct { + m schema.Maybe + v _DecodedRecipients +} +type MaybeDecodedRecipients = *_DecodedRecipients__Maybe + +func (m MaybeDecodedRecipients) IsNull() bool { + return m.m == schema.Maybe_Null +} +func (m MaybeDecodedRecipients) IsAbsent() bool { + return m.m == schema.Maybe_Absent +} +func (m MaybeDecodedRecipients) Exists() bool { + return m.m == schema.Maybe_Value +} +func (m MaybeDecodedRecipients) AsNode() datamodel.Node { + switch m.m { + case schema.Maybe_Absent: + return datamodel.Absent + case schema.Maybe_Null: + return datamodel.Null + case schema.Maybe_Value: + return &m.v + default: + panic("unreachable") + } +} +func (m MaybeDecodedRecipients) Must() DecodedRecipients { + if !m.Exists() { + panic("unbox of a maybe rejected") + } + return &m.v +} + +var _ datamodel.Node = (DecodedRecipients)(&_DecodedRecipients{}) +var _ schema.TypedNode = (DecodedRecipients)(&_DecodedRecipients{}) + +func (DecodedRecipients) Kind() datamodel.Kind { + return datamodel.Kind_List +} +func (DecodedRecipients) LookupByString(string) (datamodel.Node, error) { + return mixins.List{TypeName: "dagjose.DecodedRecipients"}.LookupByString("") +} +func (n DecodedRecipients) LookupByNode(k datamodel.Node) (datamodel.Node, error) { + idx, err := k.AsInt() + if err != nil { + return nil, err + } + return n.LookupByIndex(idx) +} +func (n DecodedRecipients) LookupByIndex(idx int64) (datamodel.Node, error) { + if n.Length() <= idx { + return nil, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfInt(idx)} + } + v := &n.x[idx] + return v, nil +} +func (n DecodedRecipients) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + i, err := seg.Index() + if err != nil { + return nil, datamodel.ErrInvalidSegmentForList{TypeName: "dagjose.DecodedRecipients", TroubleSegment: seg, Reason: err} + } + return n.LookupByIndex(i) +} +func (DecodedRecipients) MapIterator() datamodel.MapIterator { + return nil +} +func (n DecodedRecipients) ListIterator() datamodel.ListIterator { + return &_DecodedRecipients__ListItr{n, 0} +} + +type _DecodedRecipients__ListItr struct { + n DecodedRecipients + idx int +} + +func (itr *_DecodedRecipients__ListItr) Next() (idx int64, v datamodel.Node, _ error) { + if itr.idx >= len(itr.n.x) { + return -1, nil, datamodel.ErrIteratorOverread{} + } + idx = int64(itr.idx) + x := &itr.n.x[itr.idx] + v = x + itr.idx++ + return +} +func (itr *_DecodedRecipients__ListItr) Done() bool { + return itr.idx >= len(itr.n.x) +} + +func (n DecodedRecipients) Length() int64 { + return int64(len(n.x)) +} +func (DecodedRecipients) IsAbsent() bool { + return false +} +func (DecodedRecipients) IsNull() bool { + return false +} +func (DecodedRecipients) AsBool() (bool, error) { + return mixins.List{TypeName: "dagjose.DecodedRecipients"}.AsBool() +} +func (DecodedRecipients) AsInt() (int64, error) { + return mixins.List{TypeName: "dagjose.DecodedRecipients"}.AsInt() +} +func (DecodedRecipients) AsFloat() (float64, error) { + return mixins.List{TypeName: "dagjose.DecodedRecipients"}.AsFloat() +} +func (DecodedRecipients) AsString() (string, error) { + return mixins.List{TypeName: "dagjose.DecodedRecipients"}.AsString() +} +func (DecodedRecipients) AsBytes() ([]byte, error) { + return mixins.List{TypeName: "dagjose.DecodedRecipients"}.AsBytes() +} +func (DecodedRecipients) AsLink() (datamodel.Link, error) { + return mixins.List{TypeName: "dagjose.DecodedRecipients"}.AsLink() +} +func (DecodedRecipients) Prototype() datamodel.NodePrototype { + return _DecodedRecipients__Prototype{} +} + +type _DecodedRecipients__Prototype struct{} + +func (_DecodedRecipients__Prototype) NewBuilder() datamodel.NodeBuilder { + var nb _DecodedRecipients__Builder + nb.Reset() + return &nb +} + +type _DecodedRecipients__Builder struct { + _DecodedRecipients__Assembler +} + +func (nb *_DecodedRecipients__Builder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_DecodedRecipients__Builder) Reset() { + var w _DecodedRecipients + var m schema.Maybe + *nb = _DecodedRecipients__Builder{_DecodedRecipients__Assembler{w: &w, m: &m}} +} + +type _DecodedRecipients__Assembler struct { + w *_DecodedRecipients + m *schema.Maybe + state laState + + cm schema.Maybe + va _DecodedRecipient__Assembler +} + +func (na *_DecodedRecipients__Assembler) reset() { + na.state = laState_initial + na.va.reset() +} +func (_DecodedRecipients__Assembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.ListAssembler{TypeName: "dagjose.DecodedRecipients"}.BeginMap(0) +} +func (na *_DecodedRecipients__Assembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if sizeHint < 0 { + sizeHint = 0 + } + if sizeHint > 0 { + na.w.x = make([]_DecodedRecipient, 0, sizeHint) + } + return na, nil +} +func (na *_DecodedRecipients__Assembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.ListAssembler{TypeName: "dagjose.DecodedRecipients"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_DecodedRecipients__Assembler) AssignBool(bool) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedRecipients"}.AssignBool(false) +} +func (_DecodedRecipients__Assembler) AssignInt(int64) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedRecipients"}.AssignInt(0) +} +func (_DecodedRecipients__Assembler) AssignFloat(float64) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedRecipients"}.AssignFloat(0) +} +func (_DecodedRecipients__Assembler) AssignString(string) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedRecipients"}.AssignString("") +} +func (_DecodedRecipients__Assembler) AssignBytes([]byte) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedRecipients"}.AssignBytes(nil) +} +func (_DecodedRecipients__Assembler) AssignLink(datamodel.Link) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedRecipients"}.AssignLink(nil) +} +func (na *_DecodedRecipients__Assembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_DecodedRecipients); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_List { + return datamodel.ErrWrongKind{TypeName: "dagjose.DecodedRecipients", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustList, ActualKind: v.Kind()} + } + itr := v.ListIterator() + for !itr.Done() { + _, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_DecodedRecipients__Assembler) Prototype() datamodel.NodePrototype { + return _DecodedRecipients__Prototype{} +} +func (la *_DecodedRecipients__Assembler) valueFinishTidy() bool { + switch la.cm { + case schema.Maybe_Value: + la.va.w = nil + la.cm = schema.Maybe_Absent + la.state = laState_initial + la.va.reset() + return true + default: + return false + } +} +func (la *_DecodedRecipients__Assembler) AssembleValue() datamodel.NodeAssembler { + switch la.state { + case laState_initial: + // carry on + case laState_midValue: + if !la.valueFinishTidy() { + panic("invalid state: AssembleValue cannot be called when still in the middle of assembling the previous value") + } // if tidy success: carry on + case laState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + la.w.x = append(la.w.x, _DecodedRecipient{}) + la.state = laState_midValue + row := &la.w.x[len(la.w.x)-1] + la.va.w = row + la.va.m = &la.cm + return &la.va +} +func (la *_DecodedRecipients__Assembler) Finish() error { + switch la.state { + case laState_initial: + // carry on + case laState_midValue: + if !la.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case laState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + la.state = laState_finished + *la.m = schema.Maybe_Value + return nil +} +func (la *_DecodedRecipients__Assembler) ValuePrototype(_ int64) datamodel.NodePrototype { + return _DecodedRecipient__Prototype{} +} +func (DecodedRecipients) Type() schema.Type { + return nil /*TODO:typelit*/ +} +func (n DecodedRecipients) Representation() datamodel.Node { + return (*_DecodedRecipients__Repr)(n) +} + +type _DecodedRecipients__Repr _DecodedRecipients + +var _ datamodel.Node = &_DecodedRecipients__Repr{} + +func (_DecodedRecipients__Repr) Kind() datamodel.Kind { + return datamodel.Kind_List +} +func (_DecodedRecipients__Repr) LookupByString(string) (datamodel.Node, error) { + return mixins.List{TypeName: "dagjose.DecodedRecipients.Repr"}.LookupByString("") +} +func (nr *_DecodedRecipients__Repr) LookupByNode(k datamodel.Node) (datamodel.Node, error) { + v, err := (DecodedRecipients)(nr).LookupByNode(k) + if err != nil || v == datamodel.Null { + return v, err + } + return v.(DecodedRecipient).Representation(), nil +} +func (nr *_DecodedRecipients__Repr) LookupByIndex(idx int64) (datamodel.Node, error) { + v, err := (DecodedRecipients)(nr).LookupByIndex(idx) + if err != nil || v == datamodel.Null { + return v, err + } + return v.(DecodedRecipient).Representation(), nil +} +func (n _DecodedRecipients__Repr) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + i, err := seg.Index() + if err != nil { + return nil, datamodel.ErrInvalidSegmentForList{TypeName: "dagjose.DecodedRecipients.Repr", TroubleSegment: seg, Reason: err} + } + return n.LookupByIndex(i) +} +func (_DecodedRecipients__Repr) MapIterator() datamodel.MapIterator { + return nil +} +func (nr *_DecodedRecipients__Repr) ListIterator() datamodel.ListIterator { + return &_DecodedRecipients__ReprListItr{(DecodedRecipients)(nr), 0} +} + +type _DecodedRecipients__ReprListItr _DecodedRecipients__ListItr + +func (itr *_DecodedRecipients__ReprListItr) Next() (idx int64, v datamodel.Node, err error) { + idx, v, err = (*_DecodedRecipients__ListItr)(itr).Next() + if err != nil || v == datamodel.Null { + return + } + return idx, v.(DecodedRecipient).Representation(), nil +} +func (itr *_DecodedRecipients__ReprListItr) Done() bool { + return (*_DecodedRecipients__ListItr)(itr).Done() +} + +func (rn *_DecodedRecipients__Repr) Length() int64 { + return int64(len(rn.x)) +} +func (_DecodedRecipients__Repr) IsAbsent() bool { + return false +} +func (_DecodedRecipients__Repr) IsNull() bool { + return false +} +func (_DecodedRecipients__Repr) AsBool() (bool, error) { + return mixins.List{TypeName: "dagjose.DecodedRecipients.Repr"}.AsBool() +} +func (_DecodedRecipients__Repr) AsInt() (int64, error) { + return mixins.List{TypeName: "dagjose.DecodedRecipients.Repr"}.AsInt() +} +func (_DecodedRecipients__Repr) AsFloat() (float64, error) { + return mixins.List{TypeName: "dagjose.DecodedRecipients.Repr"}.AsFloat() +} +func (_DecodedRecipients__Repr) AsString() (string, error) { + return mixins.List{TypeName: "dagjose.DecodedRecipients.Repr"}.AsString() +} +func (_DecodedRecipients__Repr) AsBytes() ([]byte, error) { + return mixins.List{TypeName: "dagjose.DecodedRecipients.Repr"}.AsBytes() +} +func (_DecodedRecipients__Repr) AsLink() (datamodel.Link, error) { + return mixins.List{TypeName: "dagjose.DecodedRecipients.Repr"}.AsLink() +} +func (_DecodedRecipients__Repr) Prototype() datamodel.NodePrototype { + return _DecodedRecipients__ReprPrototype{} +} + +type _DecodedRecipients__ReprPrototype struct{} + +func (_DecodedRecipients__ReprPrototype) NewBuilder() datamodel.NodeBuilder { + var nb _DecodedRecipients__ReprBuilder + nb.Reset() + return &nb +} + +type _DecodedRecipients__ReprBuilder struct { + _DecodedRecipients__ReprAssembler +} + +func (nb *_DecodedRecipients__ReprBuilder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_DecodedRecipients__ReprBuilder) Reset() { + var w _DecodedRecipients + var m schema.Maybe + *nb = _DecodedRecipients__ReprBuilder{_DecodedRecipients__ReprAssembler{w: &w, m: &m}} +} + +type _DecodedRecipients__ReprAssembler struct { + w *_DecodedRecipients + m *schema.Maybe + state laState + + cm schema.Maybe + va _DecodedRecipient__ReprAssembler +} + +func (na *_DecodedRecipients__ReprAssembler) reset() { + na.state = laState_initial + na.va.reset() +} +func (_DecodedRecipients__ReprAssembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.ListAssembler{TypeName: "dagjose.DecodedRecipients.Repr"}.BeginMap(0) +} +func (na *_DecodedRecipients__ReprAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if sizeHint < 0 { + sizeHint = 0 + } + if sizeHint > 0 { + na.w.x = make([]_DecodedRecipient, 0, sizeHint) + } + return na, nil +} +func (na *_DecodedRecipients__ReprAssembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.ListAssembler{TypeName: "dagjose.DecodedRecipients.Repr.Repr"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_DecodedRecipients__ReprAssembler) AssignBool(bool) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedRecipients.Repr"}.AssignBool(false) +} +func (_DecodedRecipients__ReprAssembler) AssignInt(int64) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedRecipients.Repr"}.AssignInt(0) +} +func (_DecodedRecipients__ReprAssembler) AssignFloat(float64) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedRecipients.Repr"}.AssignFloat(0) +} +func (_DecodedRecipients__ReprAssembler) AssignString(string) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedRecipients.Repr"}.AssignString("") +} +func (_DecodedRecipients__ReprAssembler) AssignBytes([]byte) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedRecipients.Repr"}.AssignBytes(nil) +} +func (_DecodedRecipients__ReprAssembler) AssignLink(datamodel.Link) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedRecipients.Repr"}.AssignLink(nil) +} +func (na *_DecodedRecipients__ReprAssembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_DecodedRecipients); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_List { + return datamodel.ErrWrongKind{TypeName: "dagjose.DecodedRecipients.Repr", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustList, ActualKind: v.Kind()} + } + itr := v.ListIterator() + for !itr.Done() { + _, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_DecodedRecipients__ReprAssembler) Prototype() datamodel.NodePrototype { + return _DecodedRecipients__ReprPrototype{} +} +func (la *_DecodedRecipients__ReprAssembler) valueFinishTidy() bool { + switch la.cm { + case schema.Maybe_Value: + la.va.w = nil + la.cm = schema.Maybe_Absent + la.state = laState_initial + la.va.reset() + return true + default: + return false + } +} +func (la *_DecodedRecipients__ReprAssembler) AssembleValue() datamodel.NodeAssembler { + switch la.state { + case laState_initial: + // carry on + case laState_midValue: + if !la.valueFinishTidy() { + panic("invalid state: AssembleValue cannot be called when still in the middle of assembling the previous value") + } // if tidy success: carry on + case laState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + la.w.x = append(la.w.x, _DecodedRecipient{}) + la.state = laState_midValue + row := &la.w.x[len(la.w.x)-1] + la.va.w = row + la.va.m = &la.cm + return &la.va +} +func (la *_DecodedRecipients__ReprAssembler) Finish() error { + switch la.state { + case laState_initial: + // carry on + case laState_midValue: + if !la.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case laState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + la.state = laState_finished + *la.m = schema.Maybe_Value + return nil +} +func (la *_DecodedRecipients__ReprAssembler) ValuePrototype(_ int64) datamodel.NodePrototype { + return _DecodedRecipient__ReprPrototype{} +} + +func (n _DecodedSignature) FieldHeader() MaybeAny { + return &n.header +} +func (n _DecodedSignature) FieldProtected() MaybeBase64Url { + return &n.protected +} +func (n _DecodedSignature) FieldSignature() Base64Url { + return &n.signature +} + +type _DecodedSignature__Maybe struct { + m schema.Maybe + v DecodedSignature +} +type MaybeDecodedSignature = *_DecodedSignature__Maybe + +func (m MaybeDecodedSignature) IsNull() bool { + return m.m == schema.Maybe_Null +} +func (m MaybeDecodedSignature) IsAbsent() bool { + return m.m == schema.Maybe_Absent +} +func (m MaybeDecodedSignature) Exists() bool { + return m.m == schema.Maybe_Value +} +func (m MaybeDecodedSignature) AsNode() datamodel.Node { + switch m.m { + case schema.Maybe_Absent: + return datamodel.Absent + case schema.Maybe_Null: + return datamodel.Null + case schema.Maybe_Value: + return m.v + default: + panic("unreachable") + } +} +func (m MaybeDecodedSignature) Must() DecodedSignature { + if !m.Exists() { + panic("unbox of a maybe rejected") + } + return m.v +} + +var ( + fieldName__DecodedSignature_Header = _String{"header"} + fieldName__DecodedSignature_Protected = _String{"protected"} + fieldName__DecodedSignature_Signature = _String{"signature"} +) +var _ datamodel.Node = (DecodedSignature)(&_DecodedSignature{}) +var _ schema.TypedNode = (DecodedSignature)(&_DecodedSignature{}) + +func (DecodedSignature) Kind() datamodel.Kind { + return datamodel.Kind_Map +} +func (n DecodedSignature) LookupByString(key string) (datamodel.Node, error) { + switch key { + case "header": + if n.header.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return n.header.v, nil + case "protected": + if n.protected.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return &n.protected.v, nil + case "signature": + return &n.signature, nil + default: + return nil, schema.ErrNoSuchField{Type: nil /*TODO*/, Field: datamodel.PathSegmentOfString(key)} + } +} +func (n DecodedSignature) LookupByNode(key datamodel.Node) (datamodel.Node, error) { + ks, err := key.AsString() + if err != nil { + return nil, err + } + return n.LookupByString(ks) +} +func (DecodedSignature) LookupByIndex(idx int64) (datamodel.Node, error) { + return mixins.Map{TypeName: "dagjose.DecodedSignature"}.LookupByIndex(0) +} +func (n DecodedSignature) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + return n.LookupByString(seg.String()) +} +func (n DecodedSignature) MapIterator() datamodel.MapIterator { + return &_DecodedSignature__MapItr{n, 0} +} + +type _DecodedSignature__MapItr struct { + n DecodedSignature + idx int +} + +func (itr *_DecodedSignature__MapItr) Next() (k datamodel.Node, v datamodel.Node, _ error) { + if itr.idx >= 3 { + return nil, nil, datamodel.ErrIteratorOverread{} + } + switch itr.idx { + case 0: + k = &fieldName__DecodedSignature_Header + if itr.n.header.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = itr.n.header.v + case 1: + k = &fieldName__DecodedSignature_Protected + if itr.n.protected.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = &itr.n.protected.v + case 2: + k = &fieldName__DecodedSignature_Signature + v = &itr.n.signature + default: + panic("unreachable") + } + itr.idx++ + return +} +func (itr *_DecodedSignature__MapItr) Done() bool { + return itr.idx >= 3 +} + +func (DecodedSignature) ListIterator() datamodel.ListIterator { + return nil +} +func (DecodedSignature) Length() int64 { + return 3 +} +func (DecodedSignature) IsAbsent() bool { + return false +} +func (DecodedSignature) IsNull() bool { + return false +} +func (DecodedSignature) AsBool() (bool, error) { + return mixins.Map{TypeName: "dagjose.DecodedSignature"}.AsBool() +} +func (DecodedSignature) AsInt() (int64, error) { + return mixins.Map{TypeName: "dagjose.DecodedSignature"}.AsInt() +} +func (DecodedSignature) AsFloat() (float64, error) { + return mixins.Map{TypeName: "dagjose.DecodedSignature"}.AsFloat() +} +func (DecodedSignature) AsString() (string, error) { + return mixins.Map{TypeName: "dagjose.DecodedSignature"}.AsString() +} +func (DecodedSignature) AsBytes() ([]byte, error) { + return mixins.Map{TypeName: "dagjose.DecodedSignature"}.AsBytes() +} +func (DecodedSignature) AsLink() (datamodel.Link, error) { + return mixins.Map{TypeName: "dagjose.DecodedSignature"}.AsLink() +} +func (DecodedSignature) Prototype() datamodel.NodePrototype { + return _DecodedSignature__Prototype{} +} + +type _DecodedSignature__Prototype struct{} + +func (_DecodedSignature__Prototype) NewBuilder() datamodel.NodeBuilder { + var nb _DecodedSignature__Builder + nb.Reset() + return &nb +} + +type _DecodedSignature__Builder struct { + _DecodedSignature__Assembler +} + +func (nb *_DecodedSignature__Builder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_DecodedSignature__Builder) Reset() { + var w _DecodedSignature + var m schema.Maybe + *nb = _DecodedSignature__Builder{_DecodedSignature__Assembler{w: &w, m: &m}} +} + +type _DecodedSignature__Assembler struct { + w *_DecodedSignature + m *schema.Maybe + state maState + s int + f int + + cm schema.Maybe + ca_header _Any__Assembler + ca_protected _Base64Url__Assembler + ca_signature _Base64Url__Assembler +} + +func (na *_DecodedSignature__Assembler) reset() { + na.state = maState_initial + na.s = 0 + na.ca_header.reset() + na.ca_protected.reset() + na.ca_signature.reset() +} + +var ( + fieldBit__DecodedSignature_Header = 1 << 0 + fieldBit__DecodedSignature_Protected = 1 << 1 + fieldBit__DecodedSignature_Signature = 1 << 2 + fieldBits__DecodedSignature_sufficient = 0 + 1<<2 +) + +func (na *_DecodedSignature__Assembler) BeginMap(int64) (datamodel.MapAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if na.w == nil { + na.w = &_DecodedSignature{} + } + return na, nil +} +func (_DecodedSignature__Assembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.MapAssembler{TypeName: "dagjose.DecodedSignature"}.BeginList(0) +} +func (na *_DecodedSignature__Assembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.MapAssembler{TypeName: "dagjose.DecodedSignature"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_DecodedSignature__Assembler) AssignBool(bool) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedSignature"}.AssignBool(false) +} +func (_DecodedSignature__Assembler) AssignInt(int64) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedSignature"}.AssignInt(0) +} +func (_DecodedSignature__Assembler) AssignFloat(float64) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedSignature"}.AssignFloat(0) +} +func (_DecodedSignature__Assembler) AssignString(string) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedSignature"}.AssignString("") +} +func (_DecodedSignature__Assembler) AssignBytes([]byte) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedSignature"}.AssignBytes(nil) +} +func (_DecodedSignature__Assembler) AssignLink(datamodel.Link) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedSignature"}.AssignLink(nil) +} +func (na *_DecodedSignature__Assembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_DecodedSignature); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + if na.w == nil { + na.w = v2 + *na.m = schema.Maybe_Value + return nil + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_Map { + return datamodel.ErrWrongKind{TypeName: "dagjose.DecodedSignature", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustMap, ActualKind: v.Kind()} + } + itr := v.MapIterator() + for !itr.Done() { + k, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleKey().AssignNode(k); err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_DecodedSignature__Assembler) Prototype() datamodel.NodePrototype { + return _DecodedSignature__Prototype{} +} +func (ma *_DecodedSignature__Assembler) valueFinishTidy() bool { + switch ma.f { + case 0: + switch ma.w.header.m { + case schema.Maybe_Value: + ma.w.header.v = ma.ca_header.w + ma.state = maState_initial + return true + default: + return false + } + case 1: + switch ma.w.protected.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 2: + switch ma.cm { + case schema.Maybe_Value: + ma.ca_signature.w = nil + ma.cm = schema.Maybe_Absent + ma.state = maState_initial + return true + default: + return false + } + default: + panic("unreachable") + } +} +func (ma *_DecodedSignature__Assembler) AssembleEntry(k string) (datamodel.NodeAssembler, error) { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleEntry cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleEntry cannot be called on an assembler that's already finished") + } + switch k { + case "header": + if ma.s&fieldBit__DecodedSignature_Header != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedSignature_Header} + } + ma.s += fieldBit__DecodedSignature_Header + ma.state = maState_midValue + ma.f = 0 + ma.ca_header.w = ma.w.header.v + ma.ca_header.m = &ma.w.header.m + return &ma.ca_header, nil + case "protected": + if ma.s&fieldBit__DecodedSignature_Protected != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedSignature_Protected} + } + ma.s += fieldBit__DecodedSignature_Protected + ma.state = maState_midValue + ma.f = 1 + ma.ca_protected.w = &ma.w.protected.v + ma.ca_protected.m = &ma.w.protected.m + return &ma.ca_protected, nil + case "signature": + if ma.s&fieldBit__DecodedSignature_Signature != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedSignature_Signature} + } + ma.s += fieldBit__DecodedSignature_Signature + ma.state = maState_midValue + ma.f = 2 + ma.ca_signature.w = &ma.w.signature + ma.ca_signature.m = &ma.cm + return &ma.ca_signature, nil + } + return nil, schema.ErrInvalidKey{TypeName: "dagjose.DecodedSignature", Key: &_String{k}} +} +func (ma *_DecodedSignature__Assembler) AssembleKey() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleKey cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleKey cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleKey cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleKey cannot be called on an assembler that's already finished") + } + ma.state = maState_midKey + return (*_DecodedSignature__KeyAssembler)(ma) +} +func (ma *_DecodedSignature__Assembler) AssembleValue() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + panic("invalid state: AssembleValue cannot be called when no key is primed") + case maState_midKey: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling a key") + case maState_expectValue: + // carry on + case maState_midValue: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling another value") + case maState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + ma.state = maState_midValue + switch ma.f { + case 0: + ma.ca_header.w = ma.w.header.v + ma.ca_header.m = &ma.w.header.m + return &ma.ca_header + case 1: + ma.ca_protected.w = &ma.w.protected.v + ma.ca_protected.m = &ma.w.protected.m + return &ma.ca_protected + case 2: + ma.ca_signature.w = &ma.w.signature + ma.ca_signature.m = &ma.cm + return &ma.ca_signature + default: + panic("unreachable") + } +} +func (ma *_DecodedSignature__Assembler) Finish() error { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: Finish cannot be called when in the middle of assembling a key") + case maState_expectValue: + panic("invalid state: Finish cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + if ma.s&fieldBits__DecodedSignature_sufficient != fieldBits__DecodedSignature_sufficient { + err := schema.ErrMissingRequiredField{Missing: make([]string, 0)} + if ma.s&fieldBit__DecodedSignature_Signature == 0 { + err.Missing = append(err.Missing, "signature") + } + return err + } + ma.state = maState_finished + *ma.m = schema.Maybe_Value + return nil +} +func (ma *_DecodedSignature__Assembler) KeyPrototype() datamodel.NodePrototype { + return _String__Prototype{} +} +func (ma *_DecodedSignature__Assembler) ValuePrototype(k string) datamodel.NodePrototype { + panic("todo structbuilder mapassembler valueprototype") +} + +type _DecodedSignature__KeyAssembler _DecodedSignature__Assembler + +func (_DecodedSignature__KeyAssembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.DecodedSignature.KeyAssembler"}.BeginMap(0) +} +func (_DecodedSignature__KeyAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.DecodedSignature.KeyAssembler"}.BeginList(0) +} +func (na *_DecodedSignature__KeyAssembler) AssignNull() error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedSignature.KeyAssembler"}.AssignNull() +} +func (_DecodedSignature__KeyAssembler) AssignBool(bool) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedSignature.KeyAssembler"}.AssignBool(false) +} +func (_DecodedSignature__KeyAssembler) AssignInt(int64) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedSignature.KeyAssembler"}.AssignInt(0) +} +func (_DecodedSignature__KeyAssembler) AssignFloat(float64) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedSignature.KeyAssembler"}.AssignFloat(0) +} +func (ka *_DecodedSignature__KeyAssembler) AssignString(k string) error { + if ka.state != maState_midKey { + panic("misuse: KeyAssembler held beyond its valid lifetime") + } + switch k { + case "header": + if ka.s&fieldBit__DecodedSignature_Header != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedSignature_Header} + } + ka.s += fieldBit__DecodedSignature_Header + ka.state = maState_expectValue + ka.f = 0 + return nil + case "protected": + if ka.s&fieldBit__DecodedSignature_Protected != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedSignature_Protected} + } + ka.s += fieldBit__DecodedSignature_Protected + ka.state = maState_expectValue + ka.f = 1 + return nil + case "signature": + if ka.s&fieldBit__DecodedSignature_Signature != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedSignature_Signature} + } + ka.s += fieldBit__DecodedSignature_Signature + ka.state = maState_expectValue + ka.f = 2 + return nil + default: + return schema.ErrInvalidKey{TypeName: "dagjose.DecodedSignature", Key: &_String{k}} + } +} +func (_DecodedSignature__KeyAssembler) AssignBytes([]byte) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedSignature.KeyAssembler"}.AssignBytes(nil) +} +func (_DecodedSignature__KeyAssembler) AssignLink(datamodel.Link) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedSignature.KeyAssembler"}.AssignLink(nil) +} +func (ka *_DecodedSignature__KeyAssembler) AssignNode(v datamodel.Node) error { + if v2, err := v.AsString(); err != nil { + return err + } else { + return ka.AssignString(v2) + } +} +func (_DecodedSignature__KeyAssembler) Prototype() datamodel.NodePrototype { + return _String__Prototype{} +} +func (DecodedSignature) Type() schema.Type { + return nil /*TODO:typelit*/ +} +func (n DecodedSignature) Representation() datamodel.Node { + return (*_DecodedSignature__Repr)(n) +} + +type _DecodedSignature__Repr _DecodedSignature + +var ( + fieldName__DecodedSignature_Header_serial = _String{"header"} + fieldName__DecodedSignature_Protected_serial = _String{"protected"} + fieldName__DecodedSignature_Signature_serial = _String{"signature"} +) +var _ datamodel.Node = &_DecodedSignature__Repr{} + +func (_DecodedSignature__Repr) Kind() datamodel.Kind { + return datamodel.Kind_Map +} +func (n *_DecodedSignature__Repr) LookupByString(key string) (datamodel.Node, error) { + switch key { + case "header": + if n.header.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.header.v.Representation(), nil + case "protected": + if n.protected.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.protected.v.Representation(), nil + case "signature": + return n.signature.Representation(), nil + default: + return nil, schema.ErrNoSuchField{Type: nil /*TODO*/, Field: datamodel.PathSegmentOfString(key)} + } +} +func (n *_DecodedSignature__Repr) LookupByNode(key datamodel.Node) (datamodel.Node, error) { + ks, err := key.AsString() + if err != nil { + return nil, err + } + return n.LookupByString(ks) +} +func (_DecodedSignature__Repr) LookupByIndex(idx int64) (datamodel.Node, error) { + return mixins.Map{TypeName: "dagjose.DecodedSignature.Repr"}.LookupByIndex(0) +} +func (n _DecodedSignature__Repr) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + return n.LookupByString(seg.String()) +} +func (n *_DecodedSignature__Repr) MapIterator() datamodel.MapIterator { + return &_DecodedSignature__ReprMapItr{n, 0} +} + +type _DecodedSignature__ReprMapItr struct { + n *_DecodedSignature__Repr + idx int +} + +func (itr *_DecodedSignature__ReprMapItr) Next() (k datamodel.Node, v datamodel.Node, _ error) { +advance: + if itr.idx >= 3 { + return nil, nil, datamodel.ErrIteratorOverread{} + } + switch itr.idx { + case 0: + k = &fieldName__DecodedSignature_Header_serial + if itr.n.header.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.header.v.Representation() + case 1: + k = &fieldName__DecodedSignature_Protected_serial + if itr.n.protected.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.protected.v.Representation() + case 2: + k = &fieldName__DecodedSignature_Signature_serial + v = itr.n.signature.Representation() + default: + panic("unreachable") + } + itr.idx++ + return +} +func (itr *_DecodedSignature__ReprMapItr) Done() bool { + return itr.idx >= 3 +} +func (_DecodedSignature__Repr) ListIterator() datamodel.ListIterator { + return nil +} +func (rn *_DecodedSignature__Repr) Length() int64 { + l := 3 + if rn.header.m == schema.Maybe_Absent { + l-- + } + if rn.protected.m == schema.Maybe_Absent { + l-- + } + return int64(l) +} +func (_DecodedSignature__Repr) IsAbsent() bool { + return false +} +func (_DecodedSignature__Repr) IsNull() bool { + return false +} +func (_DecodedSignature__Repr) AsBool() (bool, error) { + return mixins.Map{TypeName: "dagjose.DecodedSignature.Repr"}.AsBool() +} +func (_DecodedSignature__Repr) AsInt() (int64, error) { + return mixins.Map{TypeName: "dagjose.DecodedSignature.Repr"}.AsInt() +} +func (_DecodedSignature__Repr) AsFloat() (float64, error) { + return mixins.Map{TypeName: "dagjose.DecodedSignature.Repr"}.AsFloat() +} +func (_DecodedSignature__Repr) AsString() (string, error) { + return mixins.Map{TypeName: "dagjose.DecodedSignature.Repr"}.AsString() +} +func (_DecodedSignature__Repr) AsBytes() ([]byte, error) { + return mixins.Map{TypeName: "dagjose.DecodedSignature.Repr"}.AsBytes() +} +func (_DecodedSignature__Repr) AsLink() (datamodel.Link, error) { + return mixins.Map{TypeName: "dagjose.DecodedSignature.Repr"}.AsLink() +} +func (_DecodedSignature__Repr) Prototype() datamodel.NodePrototype { + return _DecodedSignature__ReprPrototype{} +} + +type _DecodedSignature__ReprPrototype struct{} + +func (_DecodedSignature__ReprPrototype) NewBuilder() datamodel.NodeBuilder { + var nb _DecodedSignature__ReprBuilder + nb.Reset() + return &nb +} + +type _DecodedSignature__ReprBuilder struct { + _DecodedSignature__ReprAssembler +} + +func (nb *_DecodedSignature__ReprBuilder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_DecodedSignature__ReprBuilder) Reset() { + var w _DecodedSignature + var m schema.Maybe + *nb = _DecodedSignature__ReprBuilder{_DecodedSignature__ReprAssembler{w: &w, m: &m}} +} + +type _DecodedSignature__ReprAssembler struct { + w *_DecodedSignature + m *schema.Maybe + state maState + s int + f int + + cm schema.Maybe + ca_header _Any__ReprAssembler + ca_protected _Base64Url__ReprAssembler + ca_signature _Base64Url__ReprAssembler +} + +func (na *_DecodedSignature__ReprAssembler) reset() { + na.state = maState_initial + na.s = 0 + na.ca_header.reset() + na.ca_protected.reset() + na.ca_signature.reset() +} +func (na *_DecodedSignature__ReprAssembler) BeginMap(int64) (datamodel.MapAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if na.w == nil { + na.w = &_DecodedSignature{} + } + return na, nil +} +func (_DecodedSignature__ReprAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.MapAssembler{TypeName: "dagjose.DecodedSignature.Repr"}.BeginList(0) +} +func (na *_DecodedSignature__ReprAssembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.MapAssembler{TypeName: "dagjose.DecodedSignature.Repr.Repr"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_DecodedSignature__ReprAssembler) AssignBool(bool) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedSignature.Repr"}.AssignBool(false) +} +func (_DecodedSignature__ReprAssembler) AssignInt(int64) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedSignature.Repr"}.AssignInt(0) +} +func (_DecodedSignature__ReprAssembler) AssignFloat(float64) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedSignature.Repr"}.AssignFloat(0) +} +func (_DecodedSignature__ReprAssembler) AssignString(string) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedSignature.Repr"}.AssignString("") +} +func (_DecodedSignature__ReprAssembler) AssignBytes([]byte) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedSignature.Repr"}.AssignBytes(nil) +} +func (_DecodedSignature__ReprAssembler) AssignLink(datamodel.Link) error { + return mixins.MapAssembler{TypeName: "dagjose.DecodedSignature.Repr"}.AssignLink(nil) +} +func (na *_DecodedSignature__ReprAssembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_DecodedSignature); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + if na.w == nil { + na.w = v2 + *na.m = schema.Maybe_Value + return nil + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_Map { + return datamodel.ErrWrongKind{TypeName: "dagjose.DecodedSignature.Repr", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustMap, ActualKind: v.Kind()} + } + itr := v.MapIterator() + for !itr.Done() { + k, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleKey().AssignNode(k); err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_DecodedSignature__ReprAssembler) Prototype() datamodel.NodePrototype { + return _DecodedSignature__ReprPrototype{} +} +func (ma *_DecodedSignature__ReprAssembler) valueFinishTidy() bool { + switch ma.f { + case 0: + switch ma.w.header.m { + case schema.Maybe_Value: + ma.w.header.v = ma.ca_header.w + ma.state = maState_initial + return true + default: + return false + } + case 1: + switch ma.w.protected.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 2: + switch ma.cm { + case schema.Maybe_Value: + ma.cm = schema.Maybe_Absent + ma.state = maState_initial + return true + default: + return false + } + default: + panic("unreachable") + } +} +func (ma *_DecodedSignature__ReprAssembler) AssembleEntry(k string) (datamodel.NodeAssembler, error) { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleEntry cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleEntry cannot be called on an assembler that's already finished") + } + switch k { + case "header": + if ma.s&fieldBit__DecodedSignature_Header != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedSignature_Header_serial} + } + ma.s += fieldBit__DecodedSignature_Header + ma.state = maState_midValue + ma.f = 0 + ma.ca_header.w = ma.w.header.v + ma.ca_header.m = &ma.w.header.m + + return &ma.ca_header, nil + case "protected": + if ma.s&fieldBit__DecodedSignature_Protected != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedSignature_Protected_serial} + } + ma.s += fieldBit__DecodedSignature_Protected + ma.state = maState_midValue + ma.f = 1 + ma.ca_protected.w = &ma.w.protected.v + ma.ca_protected.m = &ma.w.protected.m + + return &ma.ca_protected, nil + case "signature": + if ma.s&fieldBit__DecodedSignature_Signature != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedSignature_Signature_serial} + } + ma.s += fieldBit__DecodedSignature_Signature + ma.state = maState_midValue + ma.f = 2 + ma.ca_signature.w = &ma.w.signature + ma.ca_signature.m = &ma.cm + return &ma.ca_signature, nil + default: + } + return nil, schema.ErrInvalidKey{TypeName: "dagjose.DecodedSignature.Repr", Key: &_String{k}} +} +func (ma *_DecodedSignature__ReprAssembler) AssembleKey() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleKey cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleKey cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleKey cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleKey cannot be called on an assembler that's already finished") + } + ma.state = maState_midKey + return (*_DecodedSignature__ReprKeyAssembler)(ma) +} +func (ma *_DecodedSignature__ReprAssembler) AssembleValue() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + panic("invalid state: AssembleValue cannot be called when no key is primed") + case maState_midKey: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling a key") + case maState_expectValue: + // carry on + case maState_midValue: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling another value") + case maState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + ma.state = maState_midValue + switch ma.f { + case 0: + ma.ca_header.w = ma.w.header.v + ma.ca_header.m = &ma.w.header.m + + return &ma.ca_header + case 1: + ma.ca_protected.w = &ma.w.protected.v + ma.ca_protected.m = &ma.w.protected.m + + return &ma.ca_protected + case 2: + ma.ca_signature.w = &ma.w.signature + ma.ca_signature.m = &ma.cm + return &ma.ca_signature + default: + panic("unreachable") + } +} +func (ma *_DecodedSignature__ReprAssembler) Finish() error { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: Finish cannot be called when in the middle of assembling a key") + case maState_expectValue: + panic("invalid state: Finish cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + if ma.s&fieldBits__DecodedSignature_sufficient != fieldBits__DecodedSignature_sufficient { + err := schema.ErrMissingRequiredField{Missing: make([]string, 0)} + if ma.s&fieldBit__DecodedSignature_Signature == 0 { + err.Missing = append(err.Missing, "signature") + } + return err + } + ma.state = maState_finished + *ma.m = schema.Maybe_Value + return nil +} +func (ma *_DecodedSignature__ReprAssembler) KeyPrototype() datamodel.NodePrototype { + return _String__Prototype{} +} +func (ma *_DecodedSignature__ReprAssembler) ValuePrototype(k string) datamodel.NodePrototype { + panic("todo structbuilder mapassembler repr valueprototype") +} + +type _DecodedSignature__ReprKeyAssembler _DecodedSignature__ReprAssembler + +func (_DecodedSignature__ReprKeyAssembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.DecodedSignature.Repr.KeyAssembler"}.BeginMap(0) +} +func (_DecodedSignature__ReprKeyAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.DecodedSignature.Repr.KeyAssembler"}.BeginList(0) +} +func (na *_DecodedSignature__ReprKeyAssembler) AssignNull() error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedSignature.Repr.KeyAssembler"}.AssignNull() +} +func (_DecodedSignature__ReprKeyAssembler) AssignBool(bool) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedSignature.Repr.KeyAssembler"}.AssignBool(false) +} +func (_DecodedSignature__ReprKeyAssembler) AssignInt(int64) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedSignature.Repr.KeyAssembler"}.AssignInt(0) +} +func (_DecodedSignature__ReprKeyAssembler) AssignFloat(float64) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedSignature.Repr.KeyAssembler"}.AssignFloat(0) +} +func (ka *_DecodedSignature__ReprKeyAssembler) AssignString(k string) error { + if ka.state != maState_midKey { + panic("misuse: KeyAssembler held beyond its valid lifetime") + } + switch k { + case "header": + if ka.s&fieldBit__DecodedSignature_Header != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedSignature_Header_serial} + } + ka.s += fieldBit__DecodedSignature_Header + ka.state = maState_expectValue + ka.f = 0 + return nil + case "protected": + if ka.s&fieldBit__DecodedSignature_Protected != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedSignature_Protected_serial} + } + ka.s += fieldBit__DecodedSignature_Protected + ka.state = maState_expectValue + ka.f = 1 + return nil + case "signature": + if ka.s&fieldBit__DecodedSignature_Signature != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__DecodedSignature_Signature_serial} + } + ka.s += fieldBit__DecodedSignature_Signature + ka.state = maState_expectValue + ka.f = 2 + return nil + } + return schema.ErrInvalidKey{TypeName: "dagjose.DecodedSignature.Repr", Key: &_String{k}} +} +func (_DecodedSignature__ReprKeyAssembler) AssignBytes([]byte) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedSignature.Repr.KeyAssembler"}.AssignBytes(nil) +} +func (_DecodedSignature__ReprKeyAssembler) AssignLink(datamodel.Link) error { + return mixins.StringAssembler{TypeName: "dagjose.DecodedSignature.Repr.KeyAssembler"}.AssignLink(nil) +} +func (ka *_DecodedSignature__ReprKeyAssembler) AssignNode(v datamodel.Node) error { + if v2, err := v.AsString(); err != nil { + return err + } else { + return ka.AssignString(v2) + } +} +func (_DecodedSignature__ReprKeyAssembler) Prototype() datamodel.NodePrototype { + return _String__Prototype{} +} + +func (n *_DecodedSignatures) Lookup(idx int64) DecodedSignature { + if n.Length() <= idx { + return nil + } + v := &n.x[idx] + return v +} +func (n *_DecodedSignatures) LookupMaybe(idx int64) MaybeDecodedSignature { + if n.Length() <= idx { + return nil + } + v := &n.x[idx] + return &_DecodedSignature__Maybe{ + m: schema.Maybe_Value, + v: v, + } +} + +var _DecodedSignatures__valueAbsent = _DecodedSignature__Maybe{m: schema.Maybe_Absent} + +func (n DecodedSignatures) Iterator() *DecodedSignatures__Itr { + return &DecodedSignatures__Itr{n, 0} +} + +type DecodedSignatures__Itr struct { + n DecodedSignatures + idx int +} + +func (itr *DecodedSignatures__Itr) Next() (idx int64, v DecodedSignature) { + if itr.idx >= len(itr.n.x) { + return -1, nil + } + idx = int64(itr.idx) + v = &itr.n.x[itr.idx] + itr.idx++ + return +} +func (itr *DecodedSignatures__Itr) Done() bool { + return itr.idx >= len(itr.n.x) +} + +type _DecodedSignatures__Maybe struct { + m schema.Maybe + v _DecodedSignatures +} +type MaybeDecodedSignatures = *_DecodedSignatures__Maybe + +func (m MaybeDecodedSignatures) IsNull() bool { + return m.m == schema.Maybe_Null +} +func (m MaybeDecodedSignatures) IsAbsent() bool { + return m.m == schema.Maybe_Absent +} +func (m MaybeDecodedSignatures) Exists() bool { + return m.m == schema.Maybe_Value +} +func (m MaybeDecodedSignatures) AsNode() datamodel.Node { + switch m.m { + case schema.Maybe_Absent: + return datamodel.Absent + case schema.Maybe_Null: + return datamodel.Null + case schema.Maybe_Value: + return &m.v + default: + panic("unreachable") + } +} +func (m MaybeDecodedSignatures) Must() DecodedSignatures { + if !m.Exists() { + panic("unbox of a maybe rejected") + } + return &m.v +} + +var _ datamodel.Node = (DecodedSignatures)(&_DecodedSignatures{}) +var _ schema.TypedNode = (DecodedSignatures)(&_DecodedSignatures{}) + +func (DecodedSignatures) Kind() datamodel.Kind { + return datamodel.Kind_List +} +func (DecodedSignatures) LookupByString(string) (datamodel.Node, error) { + return mixins.List{TypeName: "dagjose.DecodedSignatures"}.LookupByString("") +} +func (n DecodedSignatures) LookupByNode(k datamodel.Node) (datamodel.Node, error) { + idx, err := k.AsInt() + if err != nil { + return nil, err + } + return n.LookupByIndex(idx) +} +func (n DecodedSignatures) LookupByIndex(idx int64) (datamodel.Node, error) { + if n.Length() <= idx { + return nil, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfInt(idx)} + } + v := &n.x[idx] + return v, nil +} +func (n DecodedSignatures) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + i, err := seg.Index() + if err != nil { + return nil, datamodel.ErrInvalidSegmentForList{TypeName: "dagjose.DecodedSignatures", TroubleSegment: seg, Reason: err} + } + return n.LookupByIndex(i) +} +func (DecodedSignatures) MapIterator() datamodel.MapIterator { + return nil +} +func (n DecodedSignatures) ListIterator() datamodel.ListIterator { + return &_DecodedSignatures__ListItr{n, 0} +} + +type _DecodedSignatures__ListItr struct { + n DecodedSignatures + idx int +} + +func (itr *_DecodedSignatures__ListItr) Next() (idx int64, v datamodel.Node, _ error) { + if itr.idx >= len(itr.n.x) { + return -1, nil, datamodel.ErrIteratorOverread{} + } + idx = int64(itr.idx) + x := &itr.n.x[itr.idx] + v = x + itr.idx++ + return +} +func (itr *_DecodedSignatures__ListItr) Done() bool { + return itr.idx >= len(itr.n.x) +} + +func (n DecodedSignatures) Length() int64 { + return int64(len(n.x)) +} +func (DecodedSignatures) IsAbsent() bool { + return false +} +func (DecodedSignatures) IsNull() bool { + return false +} +func (DecodedSignatures) AsBool() (bool, error) { + return mixins.List{TypeName: "dagjose.DecodedSignatures"}.AsBool() +} +func (DecodedSignatures) AsInt() (int64, error) { + return mixins.List{TypeName: "dagjose.DecodedSignatures"}.AsInt() +} +func (DecodedSignatures) AsFloat() (float64, error) { + return mixins.List{TypeName: "dagjose.DecodedSignatures"}.AsFloat() +} +func (DecodedSignatures) AsString() (string, error) { + return mixins.List{TypeName: "dagjose.DecodedSignatures"}.AsString() +} +func (DecodedSignatures) AsBytes() ([]byte, error) { + return mixins.List{TypeName: "dagjose.DecodedSignatures"}.AsBytes() +} +func (DecodedSignatures) AsLink() (datamodel.Link, error) { + return mixins.List{TypeName: "dagjose.DecodedSignatures"}.AsLink() +} +func (DecodedSignatures) Prototype() datamodel.NodePrototype { + return _DecodedSignatures__Prototype{} +} + +type _DecodedSignatures__Prototype struct{} + +func (_DecodedSignatures__Prototype) NewBuilder() datamodel.NodeBuilder { + var nb _DecodedSignatures__Builder + nb.Reset() + return &nb +} + +type _DecodedSignatures__Builder struct { + _DecodedSignatures__Assembler +} + +func (nb *_DecodedSignatures__Builder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_DecodedSignatures__Builder) Reset() { + var w _DecodedSignatures + var m schema.Maybe + *nb = _DecodedSignatures__Builder{_DecodedSignatures__Assembler{w: &w, m: &m}} +} + +type _DecodedSignatures__Assembler struct { + w *_DecodedSignatures + m *schema.Maybe + state laState + + cm schema.Maybe + va _DecodedSignature__Assembler +} + +func (na *_DecodedSignatures__Assembler) reset() { + na.state = laState_initial + na.va.reset() +} +func (_DecodedSignatures__Assembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.ListAssembler{TypeName: "dagjose.DecodedSignatures"}.BeginMap(0) +} +func (na *_DecodedSignatures__Assembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if sizeHint < 0 { + sizeHint = 0 + } + if sizeHint > 0 { + na.w.x = make([]_DecodedSignature, 0, sizeHint) + } + return na, nil +} +func (na *_DecodedSignatures__Assembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.ListAssembler{TypeName: "dagjose.DecodedSignatures"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_DecodedSignatures__Assembler) AssignBool(bool) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedSignatures"}.AssignBool(false) +} +func (_DecodedSignatures__Assembler) AssignInt(int64) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedSignatures"}.AssignInt(0) +} +func (_DecodedSignatures__Assembler) AssignFloat(float64) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedSignatures"}.AssignFloat(0) +} +func (_DecodedSignatures__Assembler) AssignString(string) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedSignatures"}.AssignString("") +} +func (_DecodedSignatures__Assembler) AssignBytes([]byte) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedSignatures"}.AssignBytes(nil) +} +func (_DecodedSignatures__Assembler) AssignLink(datamodel.Link) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedSignatures"}.AssignLink(nil) +} +func (na *_DecodedSignatures__Assembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_DecodedSignatures); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_List { + return datamodel.ErrWrongKind{TypeName: "dagjose.DecodedSignatures", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustList, ActualKind: v.Kind()} + } + itr := v.ListIterator() + for !itr.Done() { + _, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_DecodedSignatures__Assembler) Prototype() datamodel.NodePrototype { + return _DecodedSignatures__Prototype{} +} +func (la *_DecodedSignatures__Assembler) valueFinishTidy() bool { + switch la.cm { + case schema.Maybe_Value: + la.va.w = nil + la.cm = schema.Maybe_Absent + la.state = laState_initial + la.va.reset() + return true + default: + return false + } +} +func (la *_DecodedSignatures__Assembler) AssembleValue() datamodel.NodeAssembler { + switch la.state { + case laState_initial: + // carry on + case laState_midValue: + if !la.valueFinishTidy() { + panic("invalid state: AssembleValue cannot be called when still in the middle of assembling the previous value") + } // if tidy success: carry on + case laState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + la.w.x = append(la.w.x, _DecodedSignature{}) + la.state = laState_midValue + row := &la.w.x[len(la.w.x)-1] + la.va.w = row + la.va.m = &la.cm + return &la.va +} +func (la *_DecodedSignatures__Assembler) Finish() error { + switch la.state { + case laState_initial: + // carry on + case laState_midValue: + if !la.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case laState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + la.state = laState_finished + *la.m = schema.Maybe_Value + return nil +} +func (la *_DecodedSignatures__Assembler) ValuePrototype(_ int64) datamodel.NodePrototype { + return _DecodedSignature__Prototype{} +} +func (DecodedSignatures) Type() schema.Type { + return nil /*TODO:typelit*/ +} +func (n DecodedSignatures) Representation() datamodel.Node { + return (*_DecodedSignatures__Repr)(n) +} + +type _DecodedSignatures__Repr _DecodedSignatures + +var _ datamodel.Node = &_DecodedSignatures__Repr{} + +func (_DecodedSignatures__Repr) Kind() datamodel.Kind { + return datamodel.Kind_List +} +func (_DecodedSignatures__Repr) LookupByString(string) (datamodel.Node, error) { + return mixins.List{TypeName: "dagjose.DecodedSignatures.Repr"}.LookupByString("") +} +func (nr *_DecodedSignatures__Repr) LookupByNode(k datamodel.Node) (datamodel.Node, error) { + v, err := (DecodedSignatures)(nr).LookupByNode(k) + if err != nil || v == datamodel.Null { + return v, err + } + return v.(DecodedSignature).Representation(), nil +} +func (nr *_DecodedSignatures__Repr) LookupByIndex(idx int64) (datamodel.Node, error) { + v, err := (DecodedSignatures)(nr).LookupByIndex(idx) + if err != nil || v == datamodel.Null { + return v, err + } + return v.(DecodedSignature).Representation(), nil +} +func (n _DecodedSignatures__Repr) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + i, err := seg.Index() + if err != nil { + return nil, datamodel.ErrInvalidSegmentForList{TypeName: "dagjose.DecodedSignatures.Repr", TroubleSegment: seg, Reason: err} + } + return n.LookupByIndex(i) +} +func (_DecodedSignatures__Repr) MapIterator() datamodel.MapIterator { + return nil +} +func (nr *_DecodedSignatures__Repr) ListIterator() datamodel.ListIterator { + return &_DecodedSignatures__ReprListItr{(DecodedSignatures)(nr), 0} +} + +type _DecodedSignatures__ReprListItr _DecodedSignatures__ListItr + +func (itr *_DecodedSignatures__ReprListItr) Next() (idx int64, v datamodel.Node, err error) { + idx, v, err = (*_DecodedSignatures__ListItr)(itr).Next() + if err != nil || v == datamodel.Null { + return + } + return idx, v.(DecodedSignature).Representation(), nil +} +func (itr *_DecodedSignatures__ReprListItr) Done() bool { + return (*_DecodedSignatures__ListItr)(itr).Done() +} + +func (rn *_DecodedSignatures__Repr) Length() int64 { + return int64(len(rn.x)) +} +func (_DecodedSignatures__Repr) IsAbsent() bool { + return false +} +func (_DecodedSignatures__Repr) IsNull() bool { + return false +} +func (_DecodedSignatures__Repr) AsBool() (bool, error) { + return mixins.List{TypeName: "dagjose.DecodedSignatures.Repr"}.AsBool() +} +func (_DecodedSignatures__Repr) AsInt() (int64, error) { + return mixins.List{TypeName: "dagjose.DecodedSignatures.Repr"}.AsInt() +} +func (_DecodedSignatures__Repr) AsFloat() (float64, error) { + return mixins.List{TypeName: "dagjose.DecodedSignatures.Repr"}.AsFloat() +} +func (_DecodedSignatures__Repr) AsString() (string, error) { + return mixins.List{TypeName: "dagjose.DecodedSignatures.Repr"}.AsString() +} +func (_DecodedSignatures__Repr) AsBytes() ([]byte, error) { + return mixins.List{TypeName: "dagjose.DecodedSignatures.Repr"}.AsBytes() +} +func (_DecodedSignatures__Repr) AsLink() (datamodel.Link, error) { + return mixins.List{TypeName: "dagjose.DecodedSignatures.Repr"}.AsLink() +} +func (_DecodedSignatures__Repr) Prototype() datamodel.NodePrototype { + return _DecodedSignatures__ReprPrototype{} +} + +type _DecodedSignatures__ReprPrototype struct{} + +func (_DecodedSignatures__ReprPrototype) NewBuilder() datamodel.NodeBuilder { + var nb _DecodedSignatures__ReprBuilder + nb.Reset() + return &nb +} + +type _DecodedSignatures__ReprBuilder struct { + _DecodedSignatures__ReprAssembler +} + +func (nb *_DecodedSignatures__ReprBuilder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_DecodedSignatures__ReprBuilder) Reset() { + var w _DecodedSignatures + var m schema.Maybe + *nb = _DecodedSignatures__ReprBuilder{_DecodedSignatures__ReprAssembler{w: &w, m: &m}} +} + +type _DecodedSignatures__ReprAssembler struct { + w *_DecodedSignatures + m *schema.Maybe + state laState + + cm schema.Maybe + va _DecodedSignature__ReprAssembler +} + +func (na *_DecodedSignatures__ReprAssembler) reset() { + na.state = laState_initial + na.va.reset() +} +func (_DecodedSignatures__ReprAssembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.ListAssembler{TypeName: "dagjose.DecodedSignatures.Repr"}.BeginMap(0) +} +func (na *_DecodedSignatures__ReprAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if sizeHint < 0 { + sizeHint = 0 + } + if sizeHint > 0 { + na.w.x = make([]_DecodedSignature, 0, sizeHint) + } + return na, nil +} +func (na *_DecodedSignatures__ReprAssembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.ListAssembler{TypeName: "dagjose.DecodedSignatures.Repr.Repr"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_DecodedSignatures__ReprAssembler) AssignBool(bool) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedSignatures.Repr"}.AssignBool(false) +} +func (_DecodedSignatures__ReprAssembler) AssignInt(int64) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedSignatures.Repr"}.AssignInt(0) +} +func (_DecodedSignatures__ReprAssembler) AssignFloat(float64) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedSignatures.Repr"}.AssignFloat(0) +} +func (_DecodedSignatures__ReprAssembler) AssignString(string) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedSignatures.Repr"}.AssignString("") +} +func (_DecodedSignatures__ReprAssembler) AssignBytes([]byte) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedSignatures.Repr"}.AssignBytes(nil) +} +func (_DecodedSignatures__ReprAssembler) AssignLink(datamodel.Link) error { + return mixins.ListAssembler{TypeName: "dagjose.DecodedSignatures.Repr"}.AssignLink(nil) +} +func (na *_DecodedSignatures__ReprAssembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_DecodedSignatures); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_List { + return datamodel.ErrWrongKind{TypeName: "dagjose.DecodedSignatures.Repr", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustList, ActualKind: v.Kind()} + } + itr := v.ListIterator() + for !itr.Done() { + _, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_DecodedSignatures__ReprAssembler) Prototype() datamodel.NodePrototype { + return _DecodedSignatures__ReprPrototype{} +} +func (la *_DecodedSignatures__ReprAssembler) valueFinishTidy() bool { + switch la.cm { + case schema.Maybe_Value: + la.va.w = nil + la.cm = schema.Maybe_Absent + la.state = laState_initial + la.va.reset() + return true + default: + return false + } +} +func (la *_DecodedSignatures__ReprAssembler) AssembleValue() datamodel.NodeAssembler { + switch la.state { + case laState_initial: + // carry on + case laState_midValue: + if !la.valueFinishTidy() { + panic("invalid state: AssembleValue cannot be called when still in the middle of assembling the previous value") + } // if tidy success: carry on + case laState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + la.w.x = append(la.w.x, _DecodedSignature{}) + la.state = laState_midValue + row := &la.w.x[len(la.w.x)-1] + la.va.w = row + la.va.m = &la.cm + return &la.va +} +func (la *_DecodedSignatures__ReprAssembler) Finish() error { + switch la.state { + case laState_initial: + // carry on + case laState_midValue: + if !la.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case laState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + la.state = laState_finished + *la.m = schema.Maybe_Value + return nil +} +func (la *_DecodedSignatures__ReprAssembler) ValuePrototype(_ int64) datamodel.NodePrototype { + return _DecodedSignature__ReprPrototype{} +} + +func (n _EncodedJOSE) FieldAad() MaybeRaw { + return &n.aad +} +func (n _EncodedJOSE) FieldCiphertext() MaybeRaw { + return &n.ciphertext +} +func (n _EncodedJOSE) FieldIv() MaybeRaw { + return &n.iv +} +func (n _EncodedJOSE) FieldLink() MaybeLink { + return &n.link +} +func (n _EncodedJOSE) FieldPayload() MaybeRaw { + return &n.payload +} +func (n _EncodedJOSE) FieldProtected() MaybeRaw { + return &n.protected +} +func (n _EncodedJOSE) FieldRecipients() MaybeEncodedRecipients { + return &n.recipients +} +func (n _EncodedJOSE) FieldSignatures() MaybeEncodedSignatures { + return &n.signatures +} +func (n _EncodedJOSE) FieldTag() MaybeRaw { + return &n.tag +} +func (n _EncodedJOSE) FieldUnprotected() MaybeAny { + return &n.unprotected +} + +type _EncodedJOSE__Maybe struct { + m schema.Maybe + v EncodedJOSE +} +type MaybeEncodedJOSE = *_EncodedJOSE__Maybe + +func (m MaybeEncodedJOSE) IsNull() bool { + return m.m == schema.Maybe_Null +} +func (m MaybeEncodedJOSE) IsAbsent() bool { + return m.m == schema.Maybe_Absent +} +func (m MaybeEncodedJOSE) Exists() bool { + return m.m == schema.Maybe_Value +} +func (m MaybeEncodedJOSE) AsNode() datamodel.Node { + switch m.m { + case schema.Maybe_Absent: + return datamodel.Absent + case schema.Maybe_Null: + return datamodel.Null + case schema.Maybe_Value: + return m.v + default: + panic("unreachable") + } +} +func (m MaybeEncodedJOSE) Must() EncodedJOSE { + if !m.Exists() { + panic("unbox of a maybe rejected") + } + return m.v +} + +var ( + fieldName__EncodedJOSE_Aad = _String{"aad"} + fieldName__EncodedJOSE_Ciphertext = _String{"ciphertext"} + fieldName__EncodedJOSE_Iv = _String{"iv"} + fieldName__EncodedJOSE_Link = _String{"link"} + fieldName__EncodedJOSE_Payload = _String{"payload"} + fieldName__EncodedJOSE_Protected = _String{"protected"} + fieldName__EncodedJOSE_Recipients = _String{"recipients"} + fieldName__EncodedJOSE_Signatures = _String{"signatures"} + fieldName__EncodedJOSE_Tag = _String{"tag"} + fieldName__EncodedJOSE_Unprotected = _String{"unprotected"} +) +var _ datamodel.Node = (EncodedJOSE)(&_EncodedJOSE{}) +var _ schema.TypedNode = (EncodedJOSE)(&_EncodedJOSE{}) + +func (EncodedJOSE) Kind() datamodel.Kind { + return datamodel.Kind_Map +} +func (n EncodedJOSE) LookupByString(key string) (datamodel.Node, error) { + switch key { + case "aad": + if n.aad.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return &n.aad.v, nil + case "ciphertext": + if n.ciphertext.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return &n.ciphertext.v, nil + case "iv": + if n.iv.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return &n.iv.v, nil + case "link": + if n.link.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return &n.link.v, nil + case "payload": + if n.payload.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return &n.payload.v, nil + case "protected": + if n.protected.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return &n.protected.v, nil + case "recipients": + if n.recipients.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return &n.recipients.v, nil + case "signatures": + if n.signatures.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return &n.signatures.v, nil + case "tag": + if n.tag.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return &n.tag.v, nil + case "unprotected": + if n.unprotected.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return n.unprotected.v, nil + default: + return nil, schema.ErrNoSuchField{Type: nil /*TODO*/, Field: datamodel.PathSegmentOfString(key)} + } +} +func (n EncodedJOSE) LookupByNode(key datamodel.Node) (datamodel.Node, error) { + ks, err := key.AsString() + if err != nil { + return nil, err + } + return n.LookupByString(ks) +} +func (EncodedJOSE) LookupByIndex(idx int64) (datamodel.Node, error) { + return mixins.Map{TypeName: "dagjose.EncodedJOSE"}.LookupByIndex(0) +} +func (n EncodedJOSE) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + return n.LookupByString(seg.String()) +} +func (n EncodedJOSE) MapIterator() datamodel.MapIterator { + return &_EncodedJOSE__MapItr{n, 0} +} + +type _EncodedJOSE__MapItr struct { + n EncodedJOSE + idx int +} + +func (itr *_EncodedJOSE__MapItr) Next() (k datamodel.Node, v datamodel.Node, _ error) { + if itr.idx >= 10 { + return nil, nil, datamodel.ErrIteratorOverread{} + } + switch itr.idx { + case 0: + k = &fieldName__EncodedJOSE_Aad + if itr.n.aad.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = &itr.n.aad.v + case 1: + k = &fieldName__EncodedJOSE_Ciphertext + if itr.n.ciphertext.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = &itr.n.ciphertext.v + case 2: + k = &fieldName__EncodedJOSE_Iv + if itr.n.iv.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = &itr.n.iv.v + case 3: + k = &fieldName__EncodedJOSE_Link + if itr.n.link.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = &itr.n.link.v + case 4: + k = &fieldName__EncodedJOSE_Payload + if itr.n.payload.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = &itr.n.payload.v + case 5: + k = &fieldName__EncodedJOSE_Protected + if itr.n.protected.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = &itr.n.protected.v + case 6: + k = &fieldName__EncodedJOSE_Recipients + if itr.n.recipients.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = &itr.n.recipients.v + case 7: + k = &fieldName__EncodedJOSE_Signatures + if itr.n.signatures.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = &itr.n.signatures.v + case 8: + k = &fieldName__EncodedJOSE_Tag + if itr.n.tag.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = &itr.n.tag.v + case 9: + k = &fieldName__EncodedJOSE_Unprotected + if itr.n.unprotected.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = itr.n.unprotected.v + default: + panic("unreachable") + } + itr.idx++ + return +} +func (itr *_EncodedJOSE__MapItr) Done() bool { + return itr.idx >= 10 +} + +func (EncodedJOSE) ListIterator() datamodel.ListIterator { + return nil +} +func (EncodedJOSE) Length() int64 { + return 10 +} +func (EncodedJOSE) IsAbsent() bool { + return false +} +func (EncodedJOSE) IsNull() bool { + return false +} +func (EncodedJOSE) AsBool() (bool, error) { + return mixins.Map{TypeName: "dagjose.EncodedJOSE"}.AsBool() +} +func (EncodedJOSE) AsInt() (int64, error) { + return mixins.Map{TypeName: "dagjose.EncodedJOSE"}.AsInt() +} +func (EncodedJOSE) AsFloat() (float64, error) { + return mixins.Map{TypeName: "dagjose.EncodedJOSE"}.AsFloat() +} +func (EncodedJOSE) AsString() (string, error) { + return mixins.Map{TypeName: "dagjose.EncodedJOSE"}.AsString() +} +func (EncodedJOSE) AsBytes() ([]byte, error) { + return mixins.Map{TypeName: "dagjose.EncodedJOSE"}.AsBytes() +} +func (EncodedJOSE) AsLink() (datamodel.Link, error) { + return mixins.Map{TypeName: "dagjose.EncodedJOSE"}.AsLink() +} +func (EncodedJOSE) Prototype() datamodel.NodePrototype { + return _EncodedJOSE__Prototype{} +} + +type _EncodedJOSE__Prototype struct{} + +func (_EncodedJOSE__Prototype) NewBuilder() datamodel.NodeBuilder { + var nb _EncodedJOSE__Builder + nb.Reset() + return &nb +} + +type _EncodedJOSE__Builder struct { + _EncodedJOSE__Assembler +} + +func (nb *_EncodedJOSE__Builder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_EncodedJOSE__Builder) Reset() { + var w _EncodedJOSE + var m schema.Maybe + *nb = _EncodedJOSE__Builder{_EncodedJOSE__Assembler{w: &w, m: &m}} +} + +type _EncodedJOSE__Assembler struct { + w *_EncodedJOSE + m *schema.Maybe + state maState + s int + f int + + cm schema.Maybe + ca_aad _Raw__Assembler + ca_ciphertext _Raw__Assembler + ca_iv _Raw__Assembler + ca_link _Link__Assembler + ca_payload _Raw__Assembler + ca_protected _Raw__Assembler + ca_recipients _EncodedRecipients__Assembler + ca_signatures _EncodedSignatures__Assembler + ca_tag _Raw__Assembler + ca_unprotected _Any__Assembler +} + +func (na *_EncodedJOSE__Assembler) reset() { + na.state = maState_initial + na.s = 0 + na.ca_aad.reset() + na.ca_ciphertext.reset() + na.ca_iv.reset() + na.ca_link.reset() + na.ca_payload.reset() + na.ca_protected.reset() + na.ca_recipients.reset() + na.ca_signatures.reset() + na.ca_tag.reset() + na.ca_unprotected.reset() +} + +var ( + fieldBit__EncodedJOSE_Aad = 1 << 0 + fieldBit__EncodedJOSE_Ciphertext = 1 << 1 + fieldBit__EncodedJOSE_Iv = 1 << 2 + fieldBit__EncodedJOSE_Link = 1 << 3 + fieldBit__EncodedJOSE_Payload = 1 << 4 + fieldBit__EncodedJOSE_Protected = 1 << 5 + fieldBit__EncodedJOSE_Recipients = 1 << 6 + fieldBit__EncodedJOSE_Signatures = 1 << 7 + fieldBit__EncodedJOSE_Tag = 1 << 8 + fieldBit__EncodedJOSE_Unprotected = 1 << 9 + fieldBits__EncodedJOSE_sufficient = 0 +) + +func (na *_EncodedJOSE__Assembler) BeginMap(int64) (datamodel.MapAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if na.w == nil { + na.w = &_EncodedJOSE{} + } + return na, nil +} +func (_EncodedJOSE__Assembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.MapAssembler{TypeName: "dagjose.EncodedJOSE"}.BeginList(0) +} +func (na *_EncodedJOSE__Assembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.MapAssembler{TypeName: "dagjose.EncodedJOSE"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_EncodedJOSE__Assembler) AssignBool(bool) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedJOSE"}.AssignBool(false) +} +func (_EncodedJOSE__Assembler) AssignInt(int64) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedJOSE"}.AssignInt(0) +} +func (_EncodedJOSE__Assembler) AssignFloat(float64) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedJOSE"}.AssignFloat(0) +} +func (_EncodedJOSE__Assembler) AssignString(string) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedJOSE"}.AssignString("") +} +func (_EncodedJOSE__Assembler) AssignBytes([]byte) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedJOSE"}.AssignBytes(nil) +} +func (_EncodedJOSE__Assembler) AssignLink(datamodel.Link) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedJOSE"}.AssignLink(nil) +} +func (na *_EncodedJOSE__Assembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_EncodedJOSE); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + if na.w == nil { + na.w = v2 + *na.m = schema.Maybe_Value + return nil + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_Map { + return datamodel.ErrWrongKind{TypeName: "dagjose.EncodedJOSE", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustMap, ActualKind: v.Kind()} + } + itr := v.MapIterator() + for !itr.Done() { + k, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleKey().AssignNode(k); err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_EncodedJOSE__Assembler) Prototype() datamodel.NodePrototype { + return _EncodedJOSE__Prototype{} +} +func (ma *_EncodedJOSE__Assembler) valueFinishTidy() bool { + switch ma.f { + case 0: + switch ma.w.aad.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 1: + switch ma.w.ciphertext.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 2: + switch ma.w.iv.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 3: + switch ma.w.link.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 4: + switch ma.w.payload.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 5: + switch ma.w.protected.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 6: + switch ma.w.recipients.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 7: + switch ma.w.signatures.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 8: + switch ma.w.tag.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 9: + switch ma.w.unprotected.m { + case schema.Maybe_Value: + ma.w.unprotected.v = ma.ca_unprotected.w + ma.state = maState_initial + return true + default: + return false + } + default: + panic("unreachable") + } +} +func (ma *_EncodedJOSE__Assembler) AssembleEntry(k string) (datamodel.NodeAssembler, error) { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleEntry cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleEntry cannot be called on an assembler that's already finished") + } + switch k { + case "aad": + if ma.s&fieldBit__EncodedJOSE_Aad != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Aad} + } + ma.s += fieldBit__EncodedJOSE_Aad + ma.state = maState_midValue + ma.f = 0 + ma.ca_aad.w = &ma.w.aad.v + ma.ca_aad.m = &ma.w.aad.m + return &ma.ca_aad, nil + case "ciphertext": + if ma.s&fieldBit__EncodedJOSE_Ciphertext != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Ciphertext} + } + ma.s += fieldBit__EncodedJOSE_Ciphertext + ma.state = maState_midValue + ma.f = 1 + ma.ca_ciphertext.w = &ma.w.ciphertext.v + ma.ca_ciphertext.m = &ma.w.ciphertext.m + return &ma.ca_ciphertext, nil + case "iv": + if ma.s&fieldBit__EncodedJOSE_Iv != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Iv} + } + ma.s += fieldBit__EncodedJOSE_Iv + ma.state = maState_midValue + ma.f = 2 + ma.ca_iv.w = &ma.w.iv.v + ma.ca_iv.m = &ma.w.iv.m + return &ma.ca_iv, nil + case "link": + if ma.s&fieldBit__EncodedJOSE_Link != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Link} + } + ma.s += fieldBit__EncodedJOSE_Link + ma.state = maState_midValue + ma.f = 3 + ma.ca_link.w = &ma.w.link.v + ma.ca_link.m = &ma.w.link.m + return &ma.ca_link, nil + case "payload": + if ma.s&fieldBit__EncodedJOSE_Payload != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Payload} + } + ma.s += fieldBit__EncodedJOSE_Payload + ma.state = maState_midValue + ma.f = 4 + ma.ca_payload.w = &ma.w.payload.v + ma.ca_payload.m = &ma.w.payload.m + return &ma.ca_payload, nil + case "protected": + if ma.s&fieldBit__EncodedJOSE_Protected != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Protected} + } + ma.s += fieldBit__EncodedJOSE_Protected + ma.state = maState_midValue + ma.f = 5 + ma.ca_protected.w = &ma.w.protected.v + ma.ca_protected.m = &ma.w.protected.m + return &ma.ca_protected, nil + case "recipients": + if ma.s&fieldBit__EncodedJOSE_Recipients != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Recipients} + } + ma.s += fieldBit__EncodedJOSE_Recipients + ma.state = maState_midValue + ma.f = 6 + ma.ca_recipients.w = &ma.w.recipients.v + ma.ca_recipients.m = &ma.w.recipients.m + return &ma.ca_recipients, nil + case "signatures": + if ma.s&fieldBit__EncodedJOSE_Signatures != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Signatures} + } + ma.s += fieldBit__EncodedJOSE_Signatures + ma.state = maState_midValue + ma.f = 7 + ma.ca_signatures.w = &ma.w.signatures.v + ma.ca_signatures.m = &ma.w.signatures.m + return &ma.ca_signatures, nil + case "tag": + if ma.s&fieldBit__EncodedJOSE_Tag != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Tag} + } + ma.s += fieldBit__EncodedJOSE_Tag + ma.state = maState_midValue + ma.f = 8 + ma.ca_tag.w = &ma.w.tag.v + ma.ca_tag.m = &ma.w.tag.m + return &ma.ca_tag, nil + case "unprotected": + if ma.s&fieldBit__EncodedJOSE_Unprotected != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Unprotected} + } + ma.s += fieldBit__EncodedJOSE_Unprotected + ma.state = maState_midValue + ma.f = 9 + ma.ca_unprotected.w = ma.w.unprotected.v + ma.ca_unprotected.m = &ma.w.unprotected.m + return &ma.ca_unprotected, nil + } + return nil, schema.ErrInvalidKey{TypeName: "dagjose.EncodedJOSE", Key: &_String{k}} +} +func (ma *_EncodedJOSE__Assembler) AssembleKey() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleKey cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleKey cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleKey cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleKey cannot be called on an assembler that's already finished") + } + ma.state = maState_midKey + return (*_EncodedJOSE__KeyAssembler)(ma) +} +func (ma *_EncodedJOSE__Assembler) AssembleValue() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + panic("invalid state: AssembleValue cannot be called when no key is primed") + case maState_midKey: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling a key") + case maState_expectValue: + // carry on + case maState_midValue: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling another value") + case maState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + ma.state = maState_midValue + switch ma.f { + case 0: + ma.ca_aad.w = &ma.w.aad.v + ma.ca_aad.m = &ma.w.aad.m + return &ma.ca_aad + case 1: + ma.ca_ciphertext.w = &ma.w.ciphertext.v + ma.ca_ciphertext.m = &ma.w.ciphertext.m + return &ma.ca_ciphertext + case 2: + ma.ca_iv.w = &ma.w.iv.v + ma.ca_iv.m = &ma.w.iv.m + return &ma.ca_iv + case 3: + ma.ca_link.w = &ma.w.link.v + ma.ca_link.m = &ma.w.link.m + return &ma.ca_link + case 4: + ma.ca_payload.w = &ma.w.payload.v + ma.ca_payload.m = &ma.w.payload.m + return &ma.ca_payload + case 5: + ma.ca_protected.w = &ma.w.protected.v + ma.ca_protected.m = &ma.w.protected.m + return &ma.ca_protected + case 6: + ma.ca_recipients.w = &ma.w.recipients.v + ma.ca_recipients.m = &ma.w.recipients.m + return &ma.ca_recipients + case 7: + ma.ca_signatures.w = &ma.w.signatures.v + ma.ca_signatures.m = &ma.w.signatures.m + return &ma.ca_signatures + case 8: + ma.ca_tag.w = &ma.w.tag.v + ma.ca_tag.m = &ma.w.tag.m + return &ma.ca_tag + case 9: + ma.ca_unprotected.w = ma.w.unprotected.v + ma.ca_unprotected.m = &ma.w.unprotected.m + return &ma.ca_unprotected + default: + panic("unreachable") + } +} +func (ma *_EncodedJOSE__Assembler) Finish() error { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: Finish cannot be called when in the middle of assembling a key") + case maState_expectValue: + panic("invalid state: Finish cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + if ma.s&fieldBits__EncodedJOSE_sufficient != fieldBits__EncodedJOSE_sufficient { + err := schema.ErrMissingRequiredField{Missing: make([]string, 0)} + return err + } + ma.state = maState_finished + *ma.m = schema.Maybe_Value + return nil +} +func (ma *_EncodedJOSE__Assembler) KeyPrototype() datamodel.NodePrototype { + return _String__Prototype{} +} +func (ma *_EncodedJOSE__Assembler) ValuePrototype(k string) datamodel.NodePrototype { + panic("todo structbuilder mapassembler valueprototype") +} + +type _EncodedJOSE__KeyAssembler _EncodedJOSE__Assembler + +func (_EncodedJOSE__KeyAssembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.EncodedJOSE.KeyAssembler"}.BeginMap(0) +} +func (_EncodedJOSE__KeyAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.EncodedJOSE.KeyAssembler"}.BeginList(0) +} +func (na *_EncodedJOSE__KeyAssembler) AssignNull() error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedJOSE.KeyAssembler"}.AssignNull() +} +func (_EncodedJOSE__KeyAssembler) AssignBool(bool) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedJOSE.KeyAssembler"}.AssignBool(false) +} +func (_EncodedJOSE__KeyAssembler) AssignInt(int64) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedJOSE.KeyAssembler"}.AssignInt(0) +} +func (_EncodedJOSE__KeyAssembler) AssignFloat(float64) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedJOSE.KeyAssembler"}.AssignFloat(0) +} +func (ka *_EncodedJOSE__KeyAssembler) AssignString(k string) error { + if ka.state != maState_midKey { + panic("misuse: KeyAssembler held beyond its valid lifetime") + } + switch k { + case "aad": + if ka.s&fieldBit__EncodedJOSE_Aad != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Aad} + } + ka.s += fieldBit__EncodedJOSE_Aad + ka.state = maState_expectValue + ka.f = 0 + return nil + case "ciphertext": + if ka.s&fieldBit__EncodedJOSE_Ciphertext != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Ciphertext} + } + ka.s += fieldBit__EncodedJOSE_Ciphertext + ka.state = maState_expectValue + ka.f = 1 + return nil + case "iv": + if ka.s&fieldBit__EncodedJOSE_Iv != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Iv} + } + ka.s += fieldBit__EncodedJOSE_Iv + ka.state = maState_expectValue + ka.f = 2 + return nil + case "link": + if ka.s&fieldBit__EncodedJOSE_Link != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Link} + } + ka.s += fieldBit__EncodedJOSE_Link + ka.state = maState_expectValue + ka.f = 3 + return nil + case "payload": + if ka.s&fieldBit__EncodedJOSE_Payload != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Payload} + } + ka.s += fieldBit__EncodedJOSE_Payload + ka.state = maState_expectValue + ka.f = 4 + return nil + case "protected": + if ka.s&fieldBit__EncodedJOSE_Protected != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Protected} + } + ka.s += fieldBit__EncodedJOSE_Protected + ka.state = maState_expectValue + ka.f = 5 + return nil + case "recipients": + if ka.s&fieldBit__EncodedJOSE_Recipients != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Recipients} + } + ka.s += fieldBit__EncodedJOSE_Recipients + ka.state = maState_expectValue + ka.f = 6 + return nil + case "signatures": + if ka.s&fieldBit__EncodedJOSE_Signatures != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Signatures} + } + ka.s += fieldBit__EncodedJOSE_Signatures + ka.state = maState_expectValue + ka.f = 7 + return nil + case "tag": + if ka.s&fieldBit__EncodedJOSE_Tag != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Tag} + } + ka.s += fieldBit__EncodedJOSE_Tag + ka.state = maState_expectValue + ka.f = 8 + return nil + case "unprotected": + if ka.s&fieldBit__EncodedJOSE_Unprotected != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Unprotected} + } + ka.s += fieldBit__EncodedJOSE_Unprotected + ka.state = maState_expectValue + ka.f = 9 + return nil + default: + return schema.ErrInvalidKey{TypeName: "dagjose.EncodedJOSE", Key: &_String{k}} + } +} +func (_EncodedJOSE__KeyAssembler) AssignBytes([]byte) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedJOSE.KeyAssembler"}.AssignBytes(nil) +} +func (_EncodedJOSE__KeyAssembler) AssignLink(datamodel.Link) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedJOSE.KeyAssembler"}.AssignLink(nil) +} +func (ka *_EncodedJOSE__KeyAssembler) AssignNode(v datamodel.Node) error { + if v2, err := v.AsString(); err != nil { + return err + } else { + return ka.AssignString(v2) + } +} +func (_EncodedJOSE__KeyAssembler) Prototype() datamodel.NodePrototype { + return _String__Prototype{} +} +func (EncodedJOSE) Type() schema.Type { + return nil /*TODO:typelit*/ +} +func (n EncodedJOSE) Representation() datamodel.Node { + return (*_EncodedJOSE__Repr)(n) +} + +type _EncodedJOSE__Repr _EncodedJOSE + +var ( + fieldName__EncodedJOSE_Aad_serial = _String{"aad"} + fieldName__EncodedJOSE_Ciphertext_serial = _String{"ciphertext"} + fieldName__EncodedJOSE_Iv_serial = _String{"iv"} + fieldName__EncodedJOSE_Link_serial = _String{"link"} + fieldName__EncodedJOSE_Payload_serial = _String{"payload"} + fieldName__EncodedJOSE_Protected_serial = _String{"protected"} + fieldName__EncodedJOSE_Recipients_serial = _String{"recipients"} + fieldName__EncodedJOSE_Signatures_serial = _String{"signatures"} + fieldName__EncodedJOSE_Tag_serial = _String{"tag"} + fieldName__EncodedJOSE_Unprotected_serial = _String{"unprotected"} +) +var _ datamodel.Node = &_EncodedJOSE__Repr{} + +func (_EncodedJOSE__Repr) Kind() datamodel.Kind { + return datamodel.Kind_Map +} +func (n *_EncodedJOSE__Repr) LookupByString(key string) (datamodel.Node, error) { + switch key { + case "aad": + if n.aad.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.aad.v.Representation(), nil + case "ciphertext": + if n.ciphertext.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.ciphertext.v.Representation(), nil + case "iv": + if n.iv.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.iv.v.Representation(), nil + case "link": + if n.link.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.link.v.Representation(), nil + case "payload": + if n.payload.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.payload.v.Representation(), nil + case "protected": + if n.protected.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.protected.v.Representation(), nil + case "recipients": + if n.recipients.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.recipients.v.Representation(), nil + case "signatures": + if n.signatures.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.signatures.v.Representation(), nil + case "tag": + if n.tag.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.tag.v.Representation(), nil + case "unprotected": + if n.unprotected.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.unprotected.v.Representation(), nil + default: + return nil, schema.ErrNoSuchField{Type: nil /*TODO*/, Field: datamodel.PathSegmentOfString(key)} + } +} +func (n *_EncodedJOSE__Repr) LookupByNode(key datamodel.Node) (datamodel.Node, error) { + ks, err := key.AsString() + if err != nil { + return nil, err + } + return n.LookupByString(ks) +} +func (_EncodedJOSE__Repr) LookupByIndex(idx int64) (datamodel.Node, error) { + return mixins.Map{TypeName: "dagjose.EncodedJOSE.Repr"}.LookupByIndex(0) +} +func (n _EncodedJOSE__Repr) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + return n.LookupByString(seg.String()) +} +func (n *_EncodedJOSE__Repr) MapIterator() datamodel.MapIterator { + end := 10 + if n.unprotected.m == schema.Maybe_Absent { + end = 9 + } else { + goto done + } + if n.tag.m == schema.Maybe_Absent { + end = 8 + } else { + goto done + } + if n.signatures.m == schema.Maybe_Absent { + end = 7 + } else { + goto done + } + if n.recipients.m == schema.Maybe_Absent { + end = 6 + } else { + goto done + } + if n.protected.m == schema.Maybe_Absent { + end = 5 + } else { + goto done + } + if n.payload.m == schema.Maybe_Absent { + end = 4 + } else { + goto done + } + if n.link.m == schema.Maybe_Absent { + end = 3 + } else { + goto done + } + if n.iv.m == schema.Maybe_Absent { + end = 2 + } else { + goto done + } + if n.ciphertext.m == schema.Maybe_Absent { + end = 1 + } else { + goto done + } + if n.aad.m == schema.Maybe_Absent { + end = 0 + } else { + goto done + } +done: + return &_EncodedJOSE__ReprMapItr{n, 0, end} +} + +type _EncodedJOSE__ReprMapItr struct { + n *_EncodedJOSE__Repr + idx int + end int +} + +func (itr *_EncodedJOSE__ReprMapItr) Next() (k datamodel.Node, v datamodel.Node, _ error) { +advance: + if itr.idx >= 10 { + return nil, nil, datamodel.ErrIteratorOverread{} + } + switch itr.idx { + case 0: + k = &fieldName__EncodedJOSE_Aad_serial + if itr.n.aad.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.aad.v.Representation() + case 1: + k = &fieldName__EncodedJOSE_Ciphertext_serial + if itr.n.ciphertext.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.ciphertext.v.Representation() + case 2: + k = &fieldName__EncodedJOSE_Iv_serial + if itr.n.iv.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.iv.v.Representation() + case 3: + k = &fieldName__EncodedJOSE_Link_serial + if itr.n.link.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.link.v.Representation() + case 4: + k = &fieldName__EncodedJOSE_Payload_serial + if itr.n.payload.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.payload.v.Representation() + case 5: + k = &fieldName__EncodedJOSE_Protected_serial + if itr.n.protected.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.protected.v.Representation() + case 6: + k = &fieldName__EncodedJOSE_Recipients_serial + if itr.n.recipients.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.recipients.v.Representation() + case 7: + k = &fieldName__EncodedJOSE_Signatures_serial + if itr.n.signatures.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.signatures.v.Representation() + case 8: + k = &fieldName__EncodedJOSE_Tag_serial + if itr.n.tag.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.tag.v.Representation() + case 9: + k = &fieldName__EncodedJOSE_Unprotected_serial + if itr.n.unprotected.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.unprotected.v.Representation() + default: + panic("unreachable") + } + itr.idx++ + return +} +func (itr *_EncodedJOSE__ReprMapItr) Done() bool { + return itr.idx >= itr.end +} +func (_EncodedJOSE__Repr) ListIterator() datamodel.ListIterator { + return nil +} +func (rn *_EncodedJOSE__Repr) Length() int64 { + l := 10 + if rn.aad.m == schema.Maybe_Absent { + l-- + } + if rn.ciphertext.m == schema.Maybe_Absent { + l-- + } + if rn.iv.m == schema.Maybe_Absent { + l-- + } + if rn.link.m == schema.Maybe_Absent { + l-- + } + if rn.payload.m == schema.Maybe_Absent { + l-- + } + if rn.protected.m == schema.Maybe_Absent { + l-- + } + if rn.recipients.m == schema.Maybe_Absent { + l-- + } + if rn.signatures.m == schema.Maybe_Absent { + l-- + } + if rn.tag.m == schema.Maybe_Absent { + l-- + } + if rn.unprotected.m == schema.Maybe_Absent { + l-- + } + return int64(l) +} +func (_EncodedJOSE__Repr) IsAbsent() bool { + return false +} +func (_EncodedJOSE__Repr) IsNull() bool { + return false +} +func (_EncodedJOSE__Repr) AsBool() (bool, error) { + return mixins.Map{TypeName: "dagjose.EncodedJOSE.Repr"}.AsBool() +} +func (_EncodedJOSE__Repr) AsInt() (int64, error) { + return mixins.Map{TypeName: "dagjose.EncodedJOSE.Repr"}.AsInt() +} +func (_EncodedJOSE__Repr) AsFloat() (float64, error) { + return mixins.Map{TypeName: "dagjose.EncodedJOSE.Repr"}.AsFloat() +} +func (_EncodedJOSE__Repr) AsString() (string, error) { + return mixins.Map{TypeName: "dagjose.EncodedJOSE.Repr"}.AsString() +} +func (_EncodedJOSE__Repr) AsBytes() ([]byte, error) { + return mixins.Map{TypeName: "dagjose.EncodedJOSE.Repr"}.AsBytes() +} +func (_EncodedJOSE__Repr) AsLink() (datamodel.Link, error) { + return mixins.Map{TypeName: "dagjose.EncodedJOSE.Repr"}.AsLink() +} +func (_EncodedJOSE__Repr) Prototype() datamodel.NodePrototype { + return _EncodedJOSE__ReprPrototype{} +} + +type _EncodedJOSE__ReprPrototype struct{} + +func (_EncodedJOSE__ReprPrototype) NewBuilder() datamodel.NodeBuilder { + var nb _EncodedJOSE__ReprBuilder + nb.Reset() + return &nb +} + +type _EncodedJOSE__ReprBuilder struct { + _EncodedJOSE__ReprAssembler +} + +func (nb *_EncodedJOSE__ReprBuilder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_EncodedJOSE__ReprBuilder) Reset() { + var w _EncodedJOSE + var m schema.Maybe + *nb = _EncodedJOSE__ReprBuilder{_EncodedJOSE__ReprAssembler{w: &w, m: &m}} +} + +type _EncodedJOSE__ReprAssembler struct { + w *_EncodedJOSE + m *schema.Maybe + state maState + s int + f int + + cm schema.Maybe + ca_aad _Raw__ReprAssembler + ca_ciphertext _Raw__ReprAssembler + ca_iv _Raw__ReprAssembler + ca_link _Link__ReprAssembler + ca_payload _Raw__ReprAssembler + ca_protected _Raw__ReprAssembler + ca_recipients _EncodedRecipients__ReprAssembler + ca_signatures _EncodedSignatures__ReprAssembler + ca_tag _Raw__ReprAssembler + ca_unprotected _Any__ReprAssembler +} + +func (na *_EncodedJOSE__ReprAssembler) reset() { + na.state = maState_initial + na.s = 0 + na.ca_aad.reset() + na.ca_ciphertext.reset() + na.ca_iv.reset() + na.ca_link.reset() + na.ca_payload.reset() + na.ca_protected.reset() + na.ca_recipients.reset() + na.ca_signatures.reset() + na.ca_tag.reset() + na.ca_unprotected.reset() +} +func (na *_EncodedJOSE__ReprAssembler) BeginMap(int64) (datamodel.MapAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if na.w == nil { + na.w = &_EncodedJOSE{} + } + return na, nil +} +func (_EncodedJOSE__ReprAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.MapAssembler{TypeName: "dagjose.EncodedJOSE.Repr"}.BeginList(0) +} +func (na *_EncodedJOSE__ReprAssembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.MapAssembler{TypeName: "dagjose.EncodedJOSE.Repr.Repr"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_EncodedJOSE__ReprAssembler) AssignBool(bool) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedJOSE.Repr"}.AssignBool(false) +} +func (_EncodedJOSE__ReprAssembler) AssignInt(int64) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedJOSE.Repr"}.AssignInt(0) +} +func (_EncodedJOSE__ReprAssembler) AssignFloat(float64) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedJOSE.Repr"}.AssignFloat(0) +} +func (_EncodedJOSE__ReprAssembler) AssignString(string) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedJOSE.Repr"}.AssignString("") +} +func (_EncodedJOSE__ReprAssembler) AssignBytes([]byte) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedJOSE.Repr"}.AssignBytes(nil) +} +func (_EncodedJOSE__ReprAssembler) AssignLink(datamodel.Link) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedJOSE.Repr"}.AssignLink(nil) +} +func (na *_EncodedJOSE__ReprAssembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_EncodedJOSE); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + if na.w == nil { + na.w = v2 + *na.m = schema.Maybe_Value + return nil + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_Map { + return datamodel.ErrWrongKind{TypeName: "dagjose.EncodedJOSE.Repr", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustMap, ActualKind: v.Kind()} + } + itr := v.MapIterator() + for !itr.Done() { + k, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleKey().AssignNode(k); err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_EncodedJOSE__ReprAssembler) Prototype() datamodel.NodePrototype { + return _EncodedJOSE__ReprPrototype{} +} +func (ma *_EncodedJOSE__ReprAssembler) valueFinishTidy() bool { + switch ma.f { + case 0: + switch ma.w.aad.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 1: + switch ma.w.ciphertext.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 2: + switch ma.w.iv.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 3: + switch ma.w.link.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 4: + switch ma.w.payload.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 5: + switch ma.w.protected.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 6: + switch ma.w.recipients.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 7: + switch ma.w.signatures.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 8: + switch ma.w.tag.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 9: + switch ma.w.unprotected.m { + case schema.Maybe_Value: + ma.w.unprotected.v = ma.ca_unprotected.w + ma.state = maState_initial + return true + default: + return false + } + default: + panic("unreachable") + } +} +func (ma *_EncodedJOSE__ReprAssembler) AssembleEntry(k string) (datamodel.NodeAssembler, error) { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleEntry cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleEntry cannot be called on an assembler that's already finished") + } + switch k { + case "aad": + if ma.s&fieldBit__EncodedJOSE_Aad != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Aad_serial} + } + ma.s += fieldBit__EncodedJOSE_Aad + ma.state = maState_midValue + ma.f = 0 + ma.ca_aad.w = &ma.w.aad.v + ma.ca_aad.m = &ma.w.aad.m + + return &ma.ca_aad, nil + case "ciphertext": + if ma.s&fieldBit__EncodedJOSE_Ciphertext != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Ciphertext_serial} + } + ma.s += fieldBit__EncodedJOSE_Ciphertext + ma.state = maState_midValue + ma.f = 1 + ma.ca_ciphertext.w = &ma.w.ciphertext.v + ma.ca_ciphertext.m = &ma.w.ciphertext.m + + return &ma.ca_ciphertext, nil + case "iv": + if ma.s&fieldBit__EncodedJOSE_Iv != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Iv_serial} + } + ma.s += fieldBit__EncodedJOSE_Iv + ma.state = maState_midValue + ma.f = 2 + ma.ca_iv.w = &ma.w.iv.v + ma.ca_iv.m = &ma.w.iv.m + + return &ma.ca_iv, nil + case "link": + if ma.s&fieldBit__EncodedJOSE_Link != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Link_serial} + } + ma.s += fieldBit__EncodedJOSE_Link + ma.state = maState_midValue + ma.f = 3 + ma.ca_link.w = &ma.w.link.v + ma.ca_link.m = &ma.w.link.m + + return &ma.ca_link, nil + case "payload": + if ma.s&fieldBit__EncodedJOSE_Payload != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Payload_serial} + } + ma.s += fieldBit__EncodedJOSE_Payload + ma.state = maState_midValue + ma.f = 4 + ma.ca_payload.w = &ma.w.payload.v + ma.ca_payload.m = &ma.w.payload.m + + return &ma.ca_payload, nil + case "protected": + if ma.s&fieldBit__EncodedJOSE_Protected != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Protected_serial} + } + ma.s += fieldBit__EncodedJOSE_Protected + ma.state = maState_midValue + ma.f = 5 + ma.ca_protected.w = &ma.w.protected.v + ma.ca_protected.m = &ma.w.protected.m + + return &ma.ca_protected, nil + case "recipients": + if ma.s&fieldBit__EncodedJOSE_Recipients != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Recipients_serial} + } + ma.s += fieldBit__EncodedJOSE_Recipients + ma.state = maState_midValue + ma.f = 6 + ma.ca_recipients.w = &ma.w.recipients.v + ma.ca_recipients.m = &ma.w.recipients.m + + return &ma.ca_recipients, nil + case "signatures": + if ma.s&fieldBit__EncodedJOSE_Signatures != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Signatures_serial} + } + ma.s += fieldBit__EncodedJOSE_Signatures + ma.state = maState_midValue + ma.f = 7 + ma.ca_signatures.w = &ma.w.signatures.v + ma.ca_signatures.m = &ma.w.signatures.m + + return &ma.ca_signatures, nil + case "tag": + if ma.s&fieldBit__EncodedJOSE_Tag != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Tag_serial} + } + ma.s += fieldBit__EncodedJOSE_Tag + ma.state = maState_midValue + ma.f = 8 + ma.ca_tag.w = &ma.w.tag.v + ma.ca_tag.m = &ma.w.tag.m + + return &ma.ca_tag, nil + case "unprotected": + if ma.s&fieldBit__EncodedJOSE_Unprotected != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Unprotected_serial} + } + ma.s += fieldBit__EncodedJOSE_Unprotected + ma.state = maState_midValue + ma.f = 9 + ma.ca_unprotected.w = ma.w.unprotected.v + ma.ca_unprotected.m = &ma.w.unprotected.m + + return &ma.ca_unprotected, nil + default: + } + return nil, schema.ErrInvalidKey{TypeName: "dagjose.EncodedJOSE.Repr", Key: &_String{k}} +} +func (ma *_EncodedJOSE__ReprAssembler) AssembleKey() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleKey cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleKey cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleKey cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleKey cannot be called on an assembler that's already finished") + } + ma.state = maState_midKey + return (*_EncodedJOSE__ReprKeyAssembler)(ma) +} +func (ma *_EncodedJOSE__ReprAssembler) AssembleValue() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + panic("invalid state: AssembleValue cannot be called when no key is primed") + case maState_midKey: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling a key") + case maState_expectValue: + // carry on + case maState_midValue: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling another value") + case maState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + ma.state = maState_midValue + switch ma.f { + case 0: + ma.ca_aad.w = &ma.w.aad.v + ma.ca_aad.m = &ma.w.aad.m + + return &ma.ca_aad + case 1: + ma.ca_ciphertext.w = &ma.w.ciphertext.v + ma.ca_ciphertext.m = &ma.w.ciphertext.m + + return &ma.ca_ciphertext + case 2: + ma.ca_iv.w = &ma.w.iv.v + ma.ca_iv.m = &ma.w.iv.m + + return &ma.ca_iv + case 3: + ma.ca_link.w = &ma.w.link.v + ma.ca_link.m = &ma.w.link.m + + return &ma.ca_link + case 4: + ma.ca_payload.w = &ma.w.payload.v + ma.ca_payload.m = &ma.w.payload.m + + return &ma.ca_payload + case 5: + ma.ca_protected.w = &ma.w.protected.v + ma.ca_protected.m = &ma.w.protected.m + + return &ma.ca_protected + case 6: + ma.ca_recipients.w = &ma.w.recipients.v + ma.ca_recipients.m = &ma.w.recipients.m + + return &ma.ca_recipients + case 7: + ma.ca_signatures.w = &ma.w.signatures.v + ma.ca_signatures.m = &ma.w.signatures.m + + return &ma.ca_signatures + case 8: + ma.ca_tag.w = &ma.w.tag.v + ma.ca_tag.m = &ma.w.tag.m + + return &ma.ca_tag + case 9: + ma.ca_unprotected.w = ma.w.unprotected.v + ma.ca_unprotected.m = &ma.w.unprotected.m + + return &ma.ca_unprotected + default: + panic("unreachable") + } +} +func (ma *_EncodedJOSE__ReprAssembler) Finish() error { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: Finish cannot be called when in the middle of assembling a key") + case maState_expectValue: + panic("invalid state: Finish cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + if ma.s&fieldBits__EncodedJOSE_sufficient != fieldBits__EncodedJOSE_sufficient { + err := schema.ErrMissingRequiredField{Missing: make([]string, 0)} + return err + } + ma.state = maState_finished + *ma.m = schema.Maybe_Value + return nil +} +func (ma *_EncodedJOSE__ReprAssembler) KeyPrototype() datamodel.NodePrototype { + return _String__Prototype{} +} +func (ma *_EncodedJOSE__ReprAssembler) ValuePrototype(k string) datamodel.NodePrototype { + panic("todo structbuilder mapassembler repr valueprototype") +} + +type _EncodedJOSE__ReprKeyAssembler _EncodedJOSE__ReprAssembler + +func (_EncodedJOSE__ReprKeyAssembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.EncodedJOSE.Repr.KeyAssembler"}.BeginMap(0) +} +func (_EncodedJOSE__ReprKeyAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.EncodedJOSE.Repr.KeyAssembler"}.BeginList(0) +} +func (na *_EncodedJOSE__ReprKeyAssembler) AssignNull() error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedJOSE.Repr.KeyAssembler"}.AssignNull() +} +func (_EncodedJOSE__ReprKeyAssembler) AssignBool(bool) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedJOSE.Repr.KeyAssembler"}.AssignBool(false) +} +func (_EncodedJOSE__ReprKeyAssembler) AssignInt(int64) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedJOSE.Repr.KeyAssembler"}.AssignInt(0) +} +func (_EncodedJOSE__ReprKeyAssembler) AssignFloat(float64) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedJOSE.Repr.KeyAssembler"}.AssignFloat(0) +} +func (ka *_EncodedJOSE__ReprKeyAssembler) AssignString(k string) error { + if ka.state != maState_midKey { + panic("misuse: KeyAssembler held beyond its valid lifetime") + } + switch k { + case "aad": + if ka.s&fieldBit__EncodedJOSE_Aad != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Aad_serial} + } + ka.s += fieldBit__EncodedJOSE_Aad + ka.state = maState_expectValue + ka.f = 0 + return nil + case "ciphertext": + if ka.s&fieldBit__EncodedJOSE_Ciphertext != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Ciphertext_serial} + } + ka.s += fieldBit__EncodedJOSE_Ciphertext + ka.state = maState_expectValue + ka.f = 1 + return nil + case "iv": + if ka.s&fieldBit__EncodedJOSE_Iv != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Iv_serial} + } + ka.s += fieldBit__EncodedJOSE_Iv + ka.state = maState_expectValue + ka.f = 2 + return nil + case "link": + if ka.s&fieldBit__EncodedJOSE_Link != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Link_serial} + } + ka.s += fieldBit__EncodedJOSE_Link + ka.state = maState_expectValue + ka.f = 3 + return nil + case "payload": + if ka.s&fieldBit__EncodedJOSE_Payload != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Payload_serial} + } + ka.s += fieldBit__EncodedJOSE_Payload + ka.state = maState_expectValue + ka.f = 4 + return nil + case "protected": + if ka.s&fieldBit__EncodedJOSE_Protected != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Protected_serial} + } + ka.s += fieldBit__EncodedJOSE_Protected + ka.state = maState_expectValue + ka.f = 5 + return nil + case "recipients": + if ka.s&fieldBit__EncodedJOSE_Recipients != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Recipients_serial} + } + ka.s += fieldBit__EncodedJOSE_Recipients + ka.state = maState_expectValue + ka.f = 6 + return nil + case "signatures": + if ka.s&fieldBit__EncodedJOSE_Signatures != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Signatures_serial} + } + ka.s += fieldBit__EncodedJOSE_Signatures + ka.state = maState_expectValue + ka.f = 7 + return nil + case "tag": + if ka.s&fieldBit__EncodedJOSE_Tag != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Tag_serial} + } + ka.s += fieldBit__EncodedJOSE_Tag + ka.state = maState_expectValue + ka.f = 8 + return nil + case "unprotected": + if ka.s&fieldBit__EncodedJOSE_Unprotected != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedJOSE_Unprotected_serial} + } + ka.s += fieldBit__EncodedJOSE_Unprotected + ka.state = maState_expectValue + ka.f = 9 + return nil + } + return schema.ErrInvalidKey{TypeName: "dagjose.EncodedJOSE.Repr", Key: &_String{k}} +} +func (_EncodedJOSE__ReprKeyAssembler) AssignBytes([]byte) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedJOSE.Repr.KeyAssembler"}.AssignBytes(nil) +} +func (_EncodedJOSE__ReprKeyAssembler) AssignLink(datamodel.Link) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedJOSE.Repr.KeyAssembler"}.AssignLink(nil) +} +func (ka *_EncodedJOSE__ReprKeyAssembler) AssignNode(v datamodel.Node) error { + if v2, err := v.AsString(); err != nil { + return err + } else { + return ka.AssignString(v2) + } +} +func (_EncodedJOSE__ReprKeyAssembler) Prototype() datamodel.NodePrototype { + return _String__Prototype{} +} + +func (n _EncodedRecipient) FieldHeader() MaybeAny { + return &n.header +} +func (n _EncodedRecipient) FieldEncrypted_key() MaybeRaw { + return &n.encrypted_key +} + +type _EncodedRecipient__Maybe struct { + m schema.Maybe + v EncodedRecipient +} +type MaybeEncodedRecipient = *_EncodedRecipient__Maybe + +func (m MaybeEncodedRecipient) IsNull() bool { + return m.m == schema.Maybe_Null +} +func (m MaybeEncodedRecipient) IsAbsent() bool { + return m.m == schema.Maybe_Absent +} +func (m MaybeEncodedRecipient) Exists() bool { + return m.m == schema.Maybe_Value +} +func (m MaybeEncodedRecipient) AsNode() datamodel.Node { + switch m.m { + case schema.Maybe_Absent: + return datamodel.Absent + case schema.Maybe_Null: + return datamodel.Null + case schema.Maybe_Value: + return m.v + default: + panic("unreachable") + } +} +func (m MaybeEncodedRecipient) Must() EncodedRecipient { + if !m.Exists() { + panic("unbox of a maybe rejected") + } + return m.v +} + +var ( + fieldName__EncodedRecipient_Header = _String{"header"} + fieldName__EncodedRecipient_Encrypted_key = _String{"encrypted_key"} +) +var _ datamodel.Node = (EncodedRecipient)(&_EncodedRecipient{}) +var _ schema.TypedNode = (EncodedRecipient)(&_EncodedRecipient{}) + +func (EncodedRecipient) Kind() datamodel.Kind { + return datamodel.Kind_Map +} +func (n EncodedRecipient) LookupByString(key string) (datamodel.Node, error) { + switch key { + case "header": + if n.header.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return n.header.v, nil + case "encrypted_key": + if n.encrypted_key.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return &n.encrypted_key.v, nil + default: + return nil, schema.ErrNoSuchField{Type: nil /*TODO*/, Field: datamodel.PathSegmentOfString(key)} + } +} +func (n EncodedRecipient) LookupByNode(key datamodel.Node) (datamodel.Node, error) { + ks, err := key.AsString() + if err != nil { + return nil, err + } + return n.LookupByString(ks) +} +func (EncodedRecipient) LookupByIndex(idx int64) (datamodel.Node, error) { + return mixins.Map{TypeName: "dagjose.EncodedRecipient"}.LookupByIndex(0) +} +func (n EncodedRecipient) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + return n.LookupByString(seg.String()) +} +func (n EncodedRecipient) MapIterator() datamodel.MapIterator { + return &_EncodedRecipient__MapItr{n, 0} +} + +type _EncodedRecipient__MapItr struct { + n EncodedRecipient + idx int +} + +func (itr *_EncodedRecipient__MapItr) Next() (k datamodel.Node, v datamodel.Node, _ error) { + if itr.idx >= 2 { + return nil, nil, datamodel.ErrIteratorOverread{} + } + switch itr.idx { + case 0: + k = &fieldName__EncodedRecipient_Header + if itr.n.header.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = itr.n.header.v + case 1: + k = &fieldName__EncodedRecipient_Encrypted_key + if itr.n.encrypted_key.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = &itr.n.encrypted_key.v + default: + panic("unreachable") + } + itr.idx++ + return +} +func (itr *_EncodedRecipient__MapItr) Done() bool { + return itr.idx >= 2 +} + +func (EncodedRecipient) ListIterator() datamodel.ListIterator { + return nil +} +func (EncodedRecipient) Length() int64 { + return 2 +} +func (EncodedRecipient) IsAbsent() bool { + return false +} +func (EncodedRecipient) IsNull() bool { + return false +} +func (EncodedRecipient) AsBool() (bool, error) { + return mixins.Map{TypeName: "dagjose.EncodedRecipient"}.AsBool() +} +func (EncodedRecipient) AsInt() (int64, error) { + return mixins.Map{TypeName: "dagjose.EncodedRecipient"}.AsInt() +} +func (EncodedRecipient) AsFloat() (float64, error) { + return mixins.Map{TypeName: "dagjose.EncodedRecipient"}.AsFloat() +} +func (EncodedRecipient) AsString() (string, error) { + return mixins.Map{TypeName: "dagjose.EncodedRecipient"}.AsString() +} +func (EncodedRecipient) AsBytes() ([]byte, error) { + return mixins.Map{TypeName: "dagjose.EncodedRecipient"}.AsBytes() +} +func (EncodedRecipient) AsLink() (datamodel.Link, error) { + return mixins.Map{TypeName: "dagjose.EncodedRecipient"}.AsLink() +} +func (EncodedRecipient) Prototype() datamodel.NodePrototype { + return _EncodedRecipient__Prototype{} +} + +type _EncodedRecipient__Prototype struct{} + +func (_EncodedRecipient__Prototype) NewBuilder() datamodel.NodeBuilder { + var nb _EncodedRecipient__Builder + nb.Reset() + return &nb +} + +type _EncodedRecipient__Builder struct { + _EncodedRecipient__Assembler +} + +func (nb *_EncodedRecipient__Builder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_EncodedRecipient__Builder) Reset() { + var w _EncodedRecipient + var m schema.Maybe + *nb = _EncodedRecipient__Builder{_EncodedRecipient__Assembler{w: &w, m: &m}} +} + +type _EncodedRecipient__Assembler struct { + w *_EncodedRecipient + m *schema.Maybe + state maState + s int + f int + + cm schema.Maybe + ca_header _Any__Assembler + ca_encrypted_key _Raw__Assembler +} + +func (na *_EncodedRecipient__Assembler) reset() { + na.state = maState_initial + na.s = 0 + na.ca_header.reset() + na.ca_encrypted_key.reset() +} + +var ( + fieldBit__EncodedRecipient_Header = 1 << 0 + fieldBit__EncodedRecipient_Encrypted_key = 1 << 1 + fieldBits__EncodedRecipient_sufficient = 0 +) + +func (na *_EncodedRecipient__Assembler) BeginMap(int64) (datamodel.MapAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if na.w == nil { + na.w = &_EncodedRecipient{} + } + return na, nil +} +func (_EncodedRecipient__Assembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.MapAssembler{TypeName: "dagjose.EncodedRecipient"}.BeginList(0) +} +func (na *_EncodedRecipient__Assembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.MapAssembler{TypeName: "dagjose.EncodedRecipient"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_EncodedRecipient__Assembler) AssignBool(bool) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedRecipient"}.AssignBool(false) +} +func (_EncodedRecipient__Assembler) AssignInt(int64) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedRecipient"}.AssignInt(0) +} +func (_EncodedRecipient__Assembler) AssignFloat(float64) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedRecipient"}.AssignFloat(0) +} +func (_EncodedRecipient__Assembler) AssignString(string) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedRecipient"}.AssignString("") +} +func (_EncodedRecipient__Assembler) AssignBytes([]byte) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedRecipient"}.AssignBytes(nil) +} +func (_EncodedRecipient__Assembler) AssignLink(datamodel.Link) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedRecipient"}.AssignLink(nil) +} +func (na *_EncodedRecipient__Assembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_EncodedRecipient); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + if na.w == nil { + na.w = v2 + *na.m = schema.Maybe_Value + return nil + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_Map { + return datamodel.ErrWrongKind{TypeName: "dagjose.EncodedRecipient", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustMap, ActualKind: v.Kind()} + } + itr := v.MapIterator() + for !itr.Done() { + k, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleKey().AssignNode(k); err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_EncodedRecipient__Assembler) Prototype() datamodel.NodePrototype { + return _EncodedRecipient__Prototype{} +} +func (ma *_EncodedRecipient__Assembler) valueFinishTidy() bool { + switch ma.f { + case 0: + switch ma.w.header.m { + case schema.Maybe_Value: + ma.w.header.v = ma.ca_header.w + ma.state = maState_initial + return true + default: + return false + } + case 1: + switch ma.w.encrypted_key.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + default: + panic("unreachable") + } +} +func (ma *_EncodedRecipient__Assembler) AssembleEntry(k string) (datamodel.NodeAssembler, error) { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleEntry cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleEntry cannot be called on an assembler that's already finished") + } + switch k { + case "header": + if ma.s&fieldBit__EncodedRecipient_Header != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedRecipient_Header} + } + ma.s += fieldBit__EncodedRecipient_Header + ma.state = maState_midValue + ma.f = 0 + ma.ca_header.w = ma.w.header.v + ma.ca_header.m = &ma.w.header.m + return &ma.ca_header, nil + case "encrypted_key": + if ma.s&fieldBit__EncodedRecipient_Encrypted_key != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedRecipient_Encrypted_key} + } + ma.s += fieldBit__EncodedRecipient_Encrypted_key + ma.state = maState_midValue + ma.f = 1 + ma.ca_encrypted_key.w = &ma.w.encrypted_key.v + ma.ca_encrypted_key.m = &ma.w.encrypted_key.m + return &ma.ca_encrypted_key, nil + } + return nil, schema.ErrInvalidKey{TypeName: "dagjose.EncodedRecipient", Key: &_String{k}} +} +func (ma *_EncodedRecipient__Assembler) AssembleKey() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleKey cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleKey cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleKey cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleKey cannot be called on an assembler that's already finished") + } + ma.state = maState_midKey + return (*_EncodedRecipient__KeyAssembler)(ma) +} +func (ma *_EncodedRecipient__Assembler) AssembleValue() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + panic("invalid state: AssembleValue cannot be called when no key is primed") + case maState_midKey: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling a key") + case maState_expectValue: + // carry on + case maState_midValue: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling another value") + case maState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + ma.state = maState_midValue + switch ma.f { + case 0: + ma.ca_header.w = ma.w.header.v + ma.ca_header.m = &ma.w.header.m + return &ma.ca_header + case 1: + ma.ca_encrypted_key.w = &ma.w.encrypted_key.v + ma.ca_encrypted_key.m = &ma.w.encrypted_key.m + return &ma.ca_encrypted_key + default: + panic("unreachable") + } +} +func (ma *_EncodedRecipient__Assembler) Finish() error { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: Finish cannot be called when in the middle of assembling a key") + case maState_expectValue: + panic("invalid state: Finish cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + if ma.s&fieldBits__EncodedRecipient_sufficient != fieldBits__EncodedRecipient_sufficient { + err := schema.ErrMissingRequiredField{Missing: make([]string, 0)} + return err + } + ma.state = maState_finished + *ma.m = schema.Maybe_Value + return nil +} +func (ma *_EncodedRecipient__Assembler) KeyPrototype() datamodel.NodePrototype { + return _String__Prototype{} +} +func (ma *_EncodedRecipient__Assembler) ValuePrototype(k string) datamodel.NodePrototype { + panic("todo structbuilder mapassembler valueprototype") +} + +type _EncodedRecipient__KeyAssembler _EncodedRecipient__Assembler + +func (_EncodedRecipient__KeyAssembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.EncodedRecipient.KeyAssembler"}.BeginMap(0) +} +func (_EncodedRecipient__KeyAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.EncodedRecipient.KeyAssembler"}.BeginList(0) +} +func (na *_EncodedRecipient__KeyAssembler) AssignNull() error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedRecipient.KeyAssembler"}.AssignNull() +} +func (_EncodedRecipient__KeyAssembler) AssignBool(bool) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedRecipient.KeyAssembler"}.AssignBool(false) +} +func (_EncodedRecipient__KeyAssembler) AssignInt(int64) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedRecipient.KeyAssembler"}.AssignInt(0) +} +func (_EncodedRecipient__KeyAssembler) AssignFloat(float64) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedRecipient.KeyAssembler"}.AssignFloat(0) +} +func (ka *_EncodedRecipient__KeyAssembler) AssignString(k string) error { + if ka.state != maState_midKey { + panic("misuse: KeyAssembler held beyond its valid lifetime") + } + switch k { + case "header": + if ka.s&fieldBit__EncodedRecipient_Header != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedRecipient_Header} + } + ka.s += fieldBit__EncodedRecipient_Header + ka.state = maState_expectValue + ka.f = 0 + return nil + case "encrypted_key": + if ka.s&fieldBit__EncodedRecipient_Encrypted_key != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedRecipient_Encrypted_key} + } + ka.s += fieldBit__EncodedRecipient_Encrypted_key + ka.state = maState_expectValue + ka.f = 1 + return nil + default: + return schema.ErrInvalidKey{TypeName: "dagjose.EncodedRecipient", Key: &_String{k}} + } +} +func (_EncodedRecipient__KeyAssembler) AssignBytes([]byte) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedRecipient.KeyAssembler"}.AssignBytes(nil) +} +func (_EncodedRecipient__KeyAssembler) AssignLink(datamodel.Link) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedRecipient.KeyAssembler"}.AssignLink(nil) +} +func (ka *_EncodedRecipient__KeyAssembler) AssignNode(v datamodel.Node) error { + if v2, err := v.AsString(); err != nil { + return err + } else { + return ka.AssignString(v2) + } +} +func (_EncodedRecipient__KeyAssembler) Prototype() datamodel.NodePrototype { + return _String__Prototype{} +} +func (EncodedRecipient) Type() schema.Type { + return nil /*TODO:typelit*/ +} +func (n EncodedRecipient) Representation() datamodel.Node { + return (*_EncodedRecipient__Repr)(n) +} + +type _EncodedRecipient__Repr _EncodedRecipient + +var ( + fieldName__EncodedRecipient_Header_serial = _String{"header"} + fieldName__EncodedRecipient_Encrypted_key_serial = _String{"encrypted_key"} +) +var _ datamodel.Node = &_EncodedRecipient__Repr{} + +func (_EncodedRecipient__Repr) Kind() datamodel.Kind { + return datamodel.Kind_Map +} +func (n *_EncodedRecipient__Repr) LookupByString(key string) (datamodel.Node, error) { + switch key { + case "header": + if n.header.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.header.v.Representation(), nil + case "encrypted_key": + if n.encrypted_key.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.encrypted_key.v.Representation(), nil + default: + return nil, schema.ErrNoSuchField{Type: nil /*TODO*/, Field: datamodel.PathSegmentOfString(key)} + } +} +func (n *_EncodedRecipient__Repr) LookupByNode(key datamodel.Node) (datamodel.Node, error) { + ks, err := key.AsString() + if err != nil { + return nil, err + } + return n.LookupByString(ks) +} +func (_EncodedRecipient__Repr) LookupByIndex(idx int64) (datamodel.Node, error) { + return mixins.Map{TypeName: "dagjose.EncodedRecipient.Repr"}.LookupByIndex(0) +} +func (n _EncodedRecipient__Repr) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + return n.LookupByString(seg.String()) +} +func (n *_EncodedRecipient__Repr) MapIterator() datamodel.MapIterator { + end := 2 + if n.encrypted_key.m == schema.Maybe_Absent { + end = 1 + } else { + goto done + } + if n.header.m == schema.Maybe_Absent { + end = 0 + } else { + goto done + } +done: + return &_EncodedRecipient__ReprMapItr{n, 0, end} +} + +type _EncodedRecipient__ReprMapItr struct { + n *_EncodedRecipient__Repr + idx int + end int +} + +func (itr *_EncodedRecipient__ReprMapItr) Next() (k datamodel.Node, v datamodel.Node, _ error) { +advance: + if itr.idx >= 2 { + return nil, nil, datamodel.ErrIteratorOverread{} + } + switch itr.idx { + case 0: + k = &fieldName__EncodedRecipient_Header_serial + if itr.n.header.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.header.v.Representation() + case 1: + k = &fieldName__EncodedRecipient_Encrypted_key_serial + if itr.n.encrypted_key.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.encrypted_key.v.Representation() + default: + panic("unreachable") + } + itr.idx++ + return +} +func (itr *_EncodedRecipient__ReprMapItr) Done() bool { + return itr.idx >= itr.end +} +func (_EncodedRecipient__Repr) ListIterator() datamodel.ListIterator { + return nil +} +func (rn *_EncodedRecipient__Repr) Length() int64 { + l := 2 + if rn.header.m == schema.Maybe_Absent { + l-- + } + if rn.encrypted_key.m == schema.Maybe_Absent { + l-- + } + return int64(l) +} +func (_EncodedRecipient__Repr) IsAbsent() bool { + return false +} +func (_EncodedRecipient__Repr) IsNull() bool { + return false +} +func (_EncodedRecipient__Repr) AsBool() (bool, error) { + return mixins.Map{TypeName: "dagjose.EncodedRecipient.Repr"}.AsBool() +} +func (_EncodedRecipient__Repr) AsInt() (int64, error) { + return mixins.Map{TypeName: "dagjose.EncodedRecipient.Repr"}.AsInt() +} +func (_EncodedRecipient__Repr) AsFloat() (float64, error) { + return mixins.Map{TypeName: "dagjose.EncodedRecipient.Repr"}.AsFloat() +} +func (_EncodedRecipient__Repr) AsString() (string, error) { + return mixins.Map{TypeName: "dagjose.EncodedRecipient.Repr"}.AsString() +} +func (_EncodedRecipient__Repr) AsBytes() ([]byte, error) { + return mixins.Map{TypeName: "dagjose.EncodedRecipient.Repr"}.AsBytes() +} +func (_EncodedRecipient__Repr) AsLink() (datamodel.Link, error) { + return mixins.Map{TypeName: "dagjose.EncodedRecipient.Repr"}.AsLink() +} +func (_EncodedRecipient__Repr) Prototype() datamodel.NodePrototype { + return _EncodedRecipient__ReprPrototype{} +} + +type _EncodedRecipient__ReprPrototype struct{} + +func (_EncodedRecipient__ReprPrototype) NewBuilder() datamodel.NodeBuilder { + var nb _EncodedRecipient__ReprBuilder + nb.Reset() + return &nb +} + +type _EncodedRecipient__ReprBuilder struct { + _EncodedRecipient__ReprAssembler +} + +func (nb *_EncodedRecipient__ReprBuilder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_EncodedRecipient__ReprBuilder) Reset() { + var w _EncodedRecipient + var m schema.Maybe + *nb = _EncodedRecipient__ReprBuilder{_EncodedRecipient__ReprAssembler{w: &w, m: &m}} +} + +type _EncodedRecipient__ReprAssembler struct { + w *_EncodedRecipient + m *schema.Maybe + state maState + s int + f int + + cm schema.Maybe + ca_header _Any__ReprAssembler + ca_encrypted_key _Raw__ReprAssembler +} + +func (na *_EncodedRecipient__ReprAssembler) reset() { + na.state = maState_initial + na.s = 0 + na.ca_header.reset() + na.ca_encrypted_key.reset() +} +func (na *_EncodedRecipient__ReprAssembler) BeginMap(int64) (datamodel.MapAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if na.w == nil { + na.w = &_EncodedRecipient{} + } + return na, nil +} +func (_EncodedRecipient__ReprAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.MapAssembler{TypeName: "dagjose.EncodedRecipient.Repr"}.BeginList(0) +} +func (na *_EncodedRecipient__ReprAssembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.MapAssembler{TypeName: "dagjose.EncodedRecipient.Repr.Repr"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_EncodedRecipient__ReprAssembler) AssignBool(bool) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedRecipient.Repr"}.AssignBool(false) +} +func (_EncodedRecipient__ReprAssembler) AssignInt(int64) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedRecipient.Repr"}.AssignInt(0) +} +func (_EncodedRecipient__ReprAssembler) AssignFloat(float64) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedRecipient.Repr"}.AssignFloat(0) +} +func (_EncodedRecipient__ReprAssembler) AssignString(string) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedRecipient.Repr"}.AssignString("") +} +func (_EncodedRecipient__ReprAssembler) AssignBytes([]byte) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedRecipient.Repr"}.AssignBytes(nil) +} +func (_EncodedRecipient__ReprAssembler) AssignLink(datamodel.Link) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedRecipient.Repr"}.AssignLink(nil) +} +func (na *_EncodedRecipient__ReprAssembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_EncodedRecipient); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + if na.w == nil { + na.w = v2 + *na.m = schema.Maybe_Value + return nil + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_Map { + return datamodel.ErrWrongKind{TypeName: "dagjose.EncodedRecipient.Repr", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustMap, ActualKind: v.Kind()} + } + itr := v.MapIterator() + for !itr.Done() { + k, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleKey().AssignNode(k); err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_EncodedRecipient__ReprAssembler) Prototype() datamodel.NodePrototype { + return _EncodedRecipient__ReprPrototype{} +} +func (ma *_EncodedRecipient__ReprAssembler) valueFinishTidy() bool { + switch ma.f { + case 0: + switch ma.w.header.m { + case schema.Maybe_Value: + ma.w.header.v = ma.ca_header.w + ma.state = maState_initial + return true + default: + return false + } + case 1: + switch ma.w.encrypted_key.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + default: + panic("unreachable") + } +} +func (ma *_EncodedRecipient__ReprAssembler) AssembleEntry(k string) (datamodel.NodeAssembler, error) { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleEntry cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleEntry cannot be called on an assembler that's already finished") + } + switch k { + case "header": + if ma.s&fieldBit__EncodedRecipient_Header != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedRecipient_Header_serial} + } + ma.s += fieldBit__EncodedRecipient_Header + ma.state = maState_midValue + ma.f = 0 + ma.ca_header.w = ma.w.header.v + ma.ca_header.m = &ma.w.header.m + + return &ma.ca_header, nil + case "encrypted_key": + if ma.s&fieldBit__EncodedRecipient_Encrypted_key != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedRecipient_Encrypted_key_serial} + } + ma.s += fieldBit__EncodedRecipient_Encrypted_key + ma.state = maState_midValue + ma.f = 1 + ma.ca_encrypted_key.w = &ma.w.encrypted_key.v + ma.ca_encrypted_key.m = &ma.w.encrypted_key.m + + return &ma.ca_encrypted_key, nil + default: + } + return nil, schema.ErrInvalidKey{TypeName: "dagjose.EncodedRecipient.Repr", Key: &_String{k}} +} +func (ma *_EncodedRecipient__ReprAssembler) AssembleKey() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleKey cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleKey cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleKey cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleKey cannot be called on an assembler that's already finished") + } + ma.state = maState_midKey + return (*_EncodedRecipient__ReprKeyAssembler)(ma) +} +func (ma *_EncodedRecipient__ReprAssembler) AssembleValue() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + panic("invalid state: AssembleValue cannot be called when no key is primed") + case maState_midKey: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling a key") + case maState_expectValue: + // carry on + case maState_midValue: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling another value") + case maState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + ma.state = maState_midValue + switch ma.f { + case 0: + ma.ca_header.w = ma.w.header.v + ma.ca_header.m = &ma.w.header.m + + return &ma.ca_header + case 1: + ma.ca_encrypted_key.w = &ma.w.encrypted_key.v + ma.ca_encrypted_key.m = &ma.w.encrypted_key.m + + return &ma.ca_encrypted_key + default: + panic("unreachable") + } +} +func (ma *_EncodedRecipient__ReprAssembler) Finish() error { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: Finish cannot be called when in the middle of assembling a key") + case maState_expectValue: + panic("invalid state: Finish cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + if ma.s&fieldBits__EncodedRecipient_sufficient != fieldBits__EncodedRecipient_sufficient { + err := schema.ErrMissingRequiredField{Missing: make([]string, 0)} + return err + } + ma.state = maState_finished + *ma.m = schema.Maybe_Value + return nil +} +func (ma *_EncodedRecipient__ReprAssembler) KeyPrototype() datamodel.NodePrototype { + return _String__Prototype{} +} +func (ma *_EncodedRecipient__ReprAssembler) ValuePrototype(k string) datamodel.NodePrototype { + panic("todo structbuilder mapassembler repr valueprototype") +} + +type _EncodedRecipient__ReprKeyAssembler _EncodedRecipient__ReprAssembler + +func (_EncodedRecipient__ReprKeyAssembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.EncodedRecipient.Repr.KeyAssembler"}.BeginMap(0) +} +func (_EncodedRecipient__ReprKeyAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.EncodedRecipient.Repr.KeyAssembler"}.BeginList(0) +} +func (na *_EncodedRecipient__ReprKeyAssembler) AssignNull() error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedRecipient.Repr.KeyAssembler"}.AssignNull() +} +func (_EncodedRecipient__ReprKeyAssembler) AssignBool(bool) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedRecipient.Repr.KeyAssembler"}.AssignBool(false) +} +func (_EncodedRecipient__ReprKeyAssembler) AssignInt(int64) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedRecipient.Repr.KeyAssembler"}.AssignInt(0) +} +func (_EncodedRecipient__ReprKeyAssembler) AssignFloat(float64) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedRecipient.Repr.KeyAssembler"}.AssignFloat(0) +} +func (ka *_EncodedRecipient__ReprKeyAssembler) AssignString(k string) error { + if ka.state != maState_midKey { + panic("misuse: KeyAssembler held beyond its valid lifetime") + } + switch k { + case "header": + if ka.s&fieldBit__EncodedRecipient_Header != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedRecipient_Header_serial} + } + ka.s += fieldBit__EncodedRecipient_Header + ka.state = maState_expectValue + ka.f = 0 + return nil + case "encrypted_key": + if ka.s&fieldBit__EncodedRecipient_Encrypted_key != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedRecipient_Encrypted_key_serial} + } + ka.s += fieldBit__EncodedRecipient_Encrypted_key + ka.state = maState_expectValue + ka.f = 1 + return nil + } + return schema.ErrInvalidKey{TypeName: "dagjose.EncodedRecipient.Repr", Key: &_String{k}} +} +func (_EncodedRecipient__ReprKeyAssembler) AssignBytes([]byte) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedRecipient.Repr.KeyAssembler"}.AssignBytes(nil) +} +func (_EncodedRecipient__ReprKeyAssembler) AssignLink(datamodel.Link) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedRecipient.Repr.KeyAssembler"}.AssignLink(nil) +} +func (ka *_EncodedRecipient__ReprKeyAssembler) AssignNode(v datamodel.Node) error { + if v2, err := v.AsString(); err != nil { + return err + } else { + return ka.AssignString(v2) + } +} +func (_EncodedRecipient__ReprKeyAssembler) Prototype() datamodel.NodePrototype { + return _String__Prototype{} +} + +func (n *_EncodedRecipients) Lookup(idx int64) EncodedRecipient { + if n.Length() <= idx { + return nil + } + v := &n.x[idx] + return v +} +func (n *_EncodedRecipients) LookupMaybe(idx int64) MaybeEncodedRecipient { + if n.Length() <= idx { + return nil + } + v := &n.x[idx] + return &_EncodedRecipient__Maybe{ + m: schema.Maybe_Value, + v: v, + } +} + +var _EncodedRecipients__valueAbsent = _EncodedRecipient__Maybe{m: schema.Maybe_Absent} + +func (n EncodedRecipients) Iterator() *EncodedRecipients__Itr { + return &EncodedRecipients__Itr{n, 0} +} + +type EncodedRecipients__Itr struct { + n EncodedRecipients + idx int +} + +func (itr *EncodedRecipients__Itr) Next() (idx int64, v EncodedRecipient) { + if itr.idx >= len(itr.n.x) { + return -1, nil + } + idx = int64(itr.idx) + v = &itr.n.x[itr.idx] + itr.idx++ + return +} +func (itr *EncodedRecipients__Itr) Done() bool { + return itr.idx >= len(itr.n.x) +} + +type _EncodedRecipients__Maybe struct { + m schema.Maybe + v _EncodedRecipients +} +type MaybeEncodedRecipients = *_EncodedRecipients__Maybe + +func (m MaybeEncodedRecipients) IsNull() bool { + return m.m == schema.Maybe_Null +} +func (m MaybeEncodedRecipients) IsAbsent() bool { + return m.m == schema.Maybe_Absent +} +func (m MaybeEncodedRecipients) Exists() bool { + return m.m == schema.Maybe_Value +} +func (m MaybeEncodedRecipients) AsNode() datamodel.Node { + switch m.m { + case schema.Maybe_Absent: + return datamodel.Absent + case schema.Maybe_Null: + return datamodel.Null + case schema.Maybe_Value: + return &m.v + default: + panic("unreachable") + } +} +func (m MaybeEncodedRecipients) Must() EncodedRecipients { + if !m.Exists() { + panic("unbox of a maybe rejected") + } + return &m.v +} + +var _ datamodel.Node = (EncodedRecipients)(&_EncodedRecipients{}) +var _ schema.TypedNode = (EncodedRecipients)(&_EncodedRecipients{}) + +func (EncodedRecipients) Kind() datamodel.Kind { + return datamodel.Kind_List +} +func (EncodedRecipients) LookupByString(string) (datamodel.Node, error) { + return mixins.List{TypeName: "dagjose.EncodedRecipients"}.LookupByString("") +} +func (n EncodedRecipients) LookupByNode(k datamodel.Node) (datamodel.Node, error) { + idx, err := k.AsInt() + if err != nil { + return nil, err + } + return n.LookupByIndex(idx) +} +func (n EncodedRecipients) LookupByIndex(idx int64) (datamodel.Node, error) { + if n.Length() <= idx { + return nil, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfInt(idx)} + } + v := &n.x[idx] + return v, nil +} +func (n EncodedRecipients) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + i, err := seg.Index() + if err != nil { + return nil, datamodel.ErrInvalidSegmentForList{TypeName: "dagjose.EncodedRecipients", TroubleSegment: seg, Reason: err} + } + return n.LookupByIndex(i) +} +func (EncodedRecipients) MapIterator() datamodel.MapIterator { + return nil +} +func (n EncodedRecipients) ListIterator() datamodel.ListIterator { + return &_EncodedRecipients__ListItr{n, 0} +} + +type _EncodedRecipients__ListItr struct { + n EncodedRecipients + idx int +} + +func (itr *_EncodedRecipients__ListItr) Next() (idx int64, v datamodel.Node, _ error) { + if itr.idx >= len(itr.n.x) { + return -1, nil, datamodel.ErrIteratorOverread{} + } + idx = int64(itr.idx) + x := &itr.n.x[itr.idx] + v = x + itr.idx++ + return +} +func (itr *_EncodedRecipients__ListItr) Done() bool { + return itr.idx >= len(itr.n.x) +} + +func (n EncodedRecipients) Length() int64 { + return int64(len(n.x)) +} +func (EncodedRecipients) IsAbsent() bool { + return false +} +func (EncodedRecipients) IsNull() bool { + return false +} +func (EncodedRecipients) AsBool() (bool, error) { + return mixins.List{TypeName: "dagjose.EncodedRecipients"}.AsBool() +} +func (EncodedRecipients) AsInt() (int64, error) { + return mixins.List{TypeName: "dagjose.EncodedRecipients"}.AsInt() +} +func (EncodedRecipients) AsFloat() (float64, error) { + return mixins.List{TypeName: "dagjose.EncodedRecipients"}.AsFloat() +} +func (EncodedRecipients) AsString() (string, error) { + return mixins.List{TypeName: "dagjose.EncodedRecipients"}.AsString() +} +func (EncodedRecipients) AsBytes() ([]byte, error) { + return mixins.List{TypeName: "dagjose.EncodedRecipients"}.AsBytes() +} +func (EncodedRecipients) AsLink() (datamodel.Link, error) { + return mixins.List{TypeName: "dagjose.EncodedRecipients"}.AsLink() +} +func (EncodedRecipients) Prototype() datamodel.NodePrototype { + return _EncodedRecipients__Prototype{} +} + +type _EncodedRecipients__Prototype struct{} + +func (_EncodedRecipients__Prototype) NewBuilder() datamodel.NodeBuilder { + var nb _EncodedRecipients__Builder + nb.Reset() + return &nb +} + +type _EncodedRecipients__Builder struct { + _EncodedRecipients__Assembler +} + +func (nb *_EncodedRecipients__Builder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_EncodedRecipients__Builder) Reset() { + var w _EncodedRecipients + var m schema.Maybe + *nb = _EncodedRecipients__Builder{_EncodedRecipients__Assembler{w: &w, m: &m}} +} + +type _EncodedRecipients__Assembler struct { + w *_EncodedRecipients + m *schema.Maybe + state laState + + cm schema.Maybe + va _EncodedRecipient__Assembler +} + +func (na *_EncodedRecipients__Assembler) reset() { + na.state = laState_initial + na.va.reset() +} +func (_EncodedRecipients__Assembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.ListAssembler{TypeName: "dagjose.EncodedRecipients"}.BeginMap(0) +} +func (na *_EncodedRecipients__Assembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if sizeHint < 0 { + sizeHint = 0 + } + if sizeHint > 0 { + na.w.x = make([]_EncodedRecipient, 0, sizeHint) + } + return na, nil +} +func (na *_EncodedRecipients__Assembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.ListAssembler{TypeName: "dagjose.EncodedRecipients"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_EncodedRecipients__Assembler) AssignBool(bool) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedRecipients"}.AssignBool(false) +} +func (_EncodedRecipients__Assembler) AssignInt(int64) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedRecipients"}.AssignInt(0) +} +func (_EncodedRecipients__Assembler) AssignFloat(float64) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedRecipients"}.AssignFloat(0) +} +func (_EncodedRecipients__Assembler) AssignString(string) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedRecipients"}.AssignString("") +} +func (_EncodedRecipients__Assembler) AssignBytes([]byte) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedRecipients"}.AssignBytes(nil) +} +func (_EncodedRecipients__Assembler) AssignLink(datamodel.Link) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedRecipients"}.AssignLink(nil) +} +func (na *_EncodedRecipients__Assembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_EncodedRecipients); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_List { + return datamodel.ErrWrongKind{TypeName: "dagjose.EncodedRecipients", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustList, ActualKind: v.Kind()} + } + itr := v.ListIterator() + for !itr.Done() { + _, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_EncodedRecipients__Assembler) Prototype() datamodel.NodePrototype { + return _EncodedRecipients__Prototype{} +} +func (la *_EncodedRecipients__Assembler) valueFinishTidy() bool { + switch la.cm { + case schema.Maybe_Value: + la.va.w = nil + la.cm = schema.Maybe_Absent + la.state = laState_initial + la.va.reset() + return true + default: + return false + } +} +func (la *_EncodedRecipients__Assembler) AssembleValue() datamodel.NodeAssembler { + switch la.state { + case laState_initial: + // carry on + case laState_midValue: + if !la.valueFinishTidy() { + panic("invalid state: AssembleValue cannot be called when still in the middle of assembling the previous value") + } // if tidy success: carry on + case laState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + la.w.x = append(la.w.x, _EncodedRecipient{}) + la.state = laState_midValue + row := &la.w.x[len(la.w.x)-1] + la.va.w = row + la.va.m = &la.cm + return &la.va +} +func (la *_EncodedRecipients__Assembler) Finish() error { + switch la.state { + case laState_initial: + // carry on + case laState_midValue: + if !la.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case laState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + la.state = laState_finished + *la.m = schema.Maybe_Value + return nil +} +func (la *_EncodedRecipients__Assembler) ValuePrototype(_ int64) datamodel.NodePrototype { + return _EncodedRecipient__Prototype{} +} +func (EncodedRecipients) Type() schema.Type { + return nil /*TODO:typelit*/ +} +func (n EncodedRecipients) Representation() datamodel.Node { + return (*_EncodedRecipients__Repr)(n) +} + +type _EncodedRecipients__Repr _EncodedRecipients + +var _ datamodel.Node = &_EncodedRecipients__Repr{} + +func (_EncodedRecipients__Repr) Kind() datamodel.Kind { + return datamodel.Kind_List +} +func (_EncodedRecipients__Repr) LookupByString(string) (datamodel.Node, error) { + return mixins.List{TypeName: "dagjose.EncodedRecipients.Repr"}.LookupByString("") +} +func (nr *_EncodedRecipients__Repr) LookupByNode(k datamodel.Node) (datamodel.Node, error) { + v, err := (EncodedRecipients)(nr).LookupByNode(k) + if err != nil || v == datamodel.Null { + return v, err + } + return v.(EncodedRecipient).Representation(), nil +} +func (nr *_EncodedRecipients__Repr) LookupByIndex(idx int64) (datamodel.Node, error) { + v, err := (EncodedRecipients)(nr).LookupByIndex(idx) + if err != nil || v == datamodel.Null { + return v, err + } + return v.(EncodedRecipient).Representation(), nil +} +func (n _EncodedRecipients__Repr) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + i, err := seg.Index() + if err != nil { + return nil, datamodel.ErrInvalidSegmentForList{TypeName: "dagjose.EncodedRecipients.Repr", TroubleSegment: seg, Reason: err} + } + return n.LookupByIndex(i) +} +func (_EncodedRecipients__Repr) MapIterator() datamodel.MapIterator { + return nil +} +func (nr *_EncodedRecipients__Repr) ListIterator() datamodel.ListIterator { + return &_EncodedRecipients__ReprListItr{(EncodedRecipients)(nr), 0} +} + +type _EncodedRecipients__ReprListItr _EncodedRecipients__ListItr + +func (itr *_EncodedRecipients__ReprListItr) Next() (idx int64, v datamodel.Node, err error) { + idx, v, err = (*_EncodedRecipients__ListItr)(itr).Next() + if err != nil || v == datamodel.Null { + return + } + return idx, v.(EncodedRecipient).Representation(), nil +} +func (itr *_EncodedRecipients__ReprListItr) Done() bool { + return (*_EncodedRecipients__ListItr)(itr).Done() +} + +func (rn *_EncodedRecipients__Repr) Length() int64 { + return int64(len(rn.x)) +} +func (_EncodedRecipients__Repr) IsAbsent() bool { + return false +} +func (_EncodedRecipients__Repr) IsNull() bool { + return false +} +func (_EncodedRecipients__Repr) AsBool() (bool, error) { + return mixins.List{TypeName: "dagjose.EncodedRecipients.Repr"}.AsBool() +} +func (_EncodedRecipients__Repr) AsInt() (int64, error) { + return mixins.List{TypeName: "dagjose.EncodedRecipients.Repr"}.AsInt() +} +func (_EncodedRecipients__Repr) AsFloat() (float64, error) { + return mixins.List{TypeName: "dagjose.EncodedRecipients.Repr"}.AsFloat() +} +func (_EncodedRecipients__Repr) AsString() (string, error) { + return mixins.List{TypeName: "dagjose.EncodedRecipients.Repr"}.AsString() +} +func (_EncodedRecipients__Repr) AsBytes() ([]byte, error) { + return mixins.List{TypeName: "dagjose.EncodedRecipients.Repr"}.AsBytes() +} +func (_EncodedRecipients__Repr) AsLink() (datamodel.Link, error) { + return mixins.List{TypeName: "dagjose.EncodedRecipients.Repr"}.AsLink() +} +func (_EncodedRecipients__Repr) Prototype() datamodel.NodePrototype { + return _EncodedRecipients__ReprPrototype{} +} + +type _EncodedRecipients__ReprPrototype struct{} + +func (_EncodedRecipients__ReprPrototype) NewBuilder() datamodel.NodeBuilder { + var nb _EncodedRecipients__ReprBuilder + nb.Reset() + return &nb +} + +type _EncodedRecipients__ReprBuilder struct { + _EncodedRecipients__ReprAssembler +} + +func (nb *_EncodedRecipients__ReprBuilder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_EncodedRecipients__ReprBuilder) Reset() { + var w _EncodedRecipients + var m schema.Maybe + *nb = _EncodedRecipients__ReprBuilder{_EncodedRecipients__ReprAssembler{w: &w, m: &m}} +} + +type _EncodedRecipients__ReprAssembler struct { + w *_EncodedRecipients + m *schema.Maybe + state laState + + cm schema.Maybe + va _EncodedRecipient__ReprAssembler +} + +func (na *_EncodedRecipients__ReprAssembler) reset() { + na.state = laState_initial + na.va.reset() +} +func (_EncodedRecipients__ReprAssembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.ListAssembler{TypeName: "dagjose.EncodedRecipients.Repr"}.BeginMap(0) +} +func (na *_EncodedRecipients__ReprAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if sizeHint < 0 { + sizeHint = 0 + } + if sizeHint > 0 { + na.w.x = make([]_EncodedRecipient, 0, sizeHint) + } + return na, nil +} +func (na *_EncodedRecipients__ReprAssembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.ListAssembler{TypeName: "dagjose.EncodedRecipients.Repr.Repr"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_EncodedRecipients__ReprAssembler) AssignBool(bool) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedRecipients.Repr"}.AssignBool(false) +} +func (_EncodedRecipients__ReprAssembler) AssignInt(int64) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedRecipients.Repr"}.AssignInt(0) +} +func (_EncodedRecipients__ReprAssembler) AssignFloat(float64) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedRecipients.Repr"}.AssignFloat(0) +} +func (_EncodedRecipients__ReprAssembler) AssignString(string) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedRecipients.Repr"}.AssignString("") +} +func (_EncodedRecipients__ReprAssembler) AssignBytes([]byte) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedRecipients.Repr"}.AssignBytes(nil) +} +func (_EncodedRecipients__ReprAssembler) AssignLink(datamodel.Link) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedRecipients.Repr"}.AssignLink(nil) +} +func (na *_EncodedRecipients__ReprAssembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_EncodedRecipients); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_List { + return datamodel.ErrWrongKind{TypeName: "dagjose.EncodedRecipients.Repr", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustList, ActualKind: v.Kind()} + } + itr := v.ListIterator() + for !itr.Done() { + _, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_EncodedRecipients__ReprAssembler) Prototype() datamodel.NodePrototype { + return _EncodedRecipients__ReprPrototype{} +} +func (la *_EncodedRecipients__ReprAssembler) valueFinishTidy() bool { + switch la.cm { + case schema.Maybe_Value: + la.va.w = nil + la.cm = schema.Maybe_Absent + la.state = laState_initial + la.va.reset() + return true + default: + return false + } +} +func (la *_EncodedRecipients__ReprAssembler) AssembleValue() datamodel.NodeAssembler { + switch la.state { + case laState_initial: + // carry on + case laState_midValue: + if !la.valueFinishTidy() { + panic("invalid state: AssembleValue cannot be called when still in the middle of assembling the previous value") + } // if tidy success: carry on + case laState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + la.w.x = append(la.w.x, _EncodedRecipient{}) + la.state = laState_midValue + row := &la.w.x[len(la.w.x)-1] + la.va.w = row + la.va.m = &la.cm + return &la.va +} +func (la *_EncodedRecipients__ReprAssembler) Finish() error { + switch la.state { + case laState_initial: + // carry on + case laState_midValue: + if !la.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case laState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + la.state = laState_finished + *la.m = schema.Maybe_Value + return nil +} +func (la *_EncodedRecipients__ReprAssembler) ValuePrototype(_ int64) datamodel.NodePrototype { + return _EncodedRecipient__ReprPrototype{} +} + +func (n _EncodedSignature) FieldHeader() MaybeAny { + return &n.header +} +func (n _EncodedSignature) FieldProtected() MaybeRaw { + return &n.protected +} +func (n _EncodedSignature) FieldSignature() Raw { + return &n.signature +} + +type _EncodedSignature__Maybe struct { + m schema.Maybe + v EncodedSignature +} +type MaybeEncodedSignature = *_EncodedSignature__Maybe + +func (m MaybeEncodedSignature) IsNull() bool { + return m.m == schema.Maybe_Null +} +func (m MaybeEncodedSignature) IsAbsent() bool { + return m.m == schema.Maybe_Absent +} +func (m MaybeEncodedSignature) Exists() bool { + return m.m == schema.Maybe_Value +} +func (m MaybeEncodedSignature) AsNode() datamodel.Node { + switch m.m { + case schema.Maybe_Absent: + return datamodel.Absent + case schema.Maybe_Null: + return datamodel.Null + case schema.Maybe_Value: + return m.v + default: + panic("unreachable") + } +} +func (m MaybeEncodedSignature) Must() EncodedSignature { + if !m.Exists() { + panic("unbox of a maybe rejected") + } + return m.v +} + +var ( + fieldName__EncodedSignature_Header = _String{"header"} + fieldName__EncodedSignature_Protected = _String{"protected"} + fieldName__EncodedSignature_Signature = _String{"signature"} +) +var _ datamodel.Node = (EncodedSignature)(&_EncodedSignature{}) +var _ schema.TypedNode = (EncodedSignature)(&_EncodedSignature{}) + +func (EncodedSignature) Kind() datamodel.Kind { + return datamodel.Kind_Map +} +func (n EncodedSignature) LookupByString(key string) (datamodel.Node, error) { + switch key { + case "header": + if n.header.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return n.header.v, nil + case "protected": + if n.protected.m == schema.Maybe_Absent { + return datamodel.Absent, nil + } + return &n.protected.v, nil + case "signature": + return &n.signature, nil + default: + return nil, schema.ErrNoSuchField{Type: nil /*TODO*/, Field: datamodel.PathSegmentOfString(key)} + } +} +func (n EncodedSignature) LookupByNode(key datamodel.Node) (datamodel.Node, error) { + ks, err := key.AsString() + if err != nil { + return nil, err + } + return n.LookupByString(ks) +} +func (EncodedSignature) LookupByIndex(idx int64) (datamodel.Node, error) { + return mixins.Map{TypeName: "dagjose.EncodedSignature"}.LookupByIndex(0) +} +func (n EncodedSignature) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + return n.LookupByString(seg.String()) +} +func (n EncodedSignature) MapIterator() datamodel.MapIterator { + return &_EncodedSignature__MapItr{n, 0} +} + +type _EncodedSignature__MapItr struct { + n EncodedSignature + idx int +} + +func (itr *_EncodedSignature__MapItr) Next() (k datamodel.Node, v datamodel.Node, _ error) { + if itr.idx >= 3 { + return nil, nil, datamodel.ErrIteratorOverread{} + } + switch itr.idx { + case 0: + k = &fieldName__EncodedSignature_Header + if itr.n.header.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = itr.n.header.v + case 1: + k = &fieldName__EncodedSignature_Protected + if itr.n.protected.m == schema.Maybe_Absent { + v = datamodel.Absent + break + } + v = &itr.n.protected.v + case 2: + k = &fieldName__EncodedSignature_Signature + v = &itr.n.signature + default: + panic("unreachable") + } + itr.idx++ + return +} +func (itr *_EncodedSignature__MapItr) Done() bool { + return itr.idx >= 3 +} + +func (EncodedSignature) ListIterator() datamodel.ListIterator { + return nil +} +func (EncodedSignature) Length() int64 { + return 3 +} +func (EncodedSignature) IsAbsent() bool { + return false +} +func (EncodedSignature) IsNull() bool { + return false +} +func (EncodedSignature) AsBool() (bool, error) { + return mixins.Map{TypeName: "dagjose.EncodedSignature"}.AsBool() +} +func (EncodedSignature) AsInt() (int64, error) { + return mixins.Map{TypeName: "dagjose.EncodedSignature"}.AsInt() +} +func (EncodedSignature) AsFloat() (float64, error) { + return mixins.Map{TypeName: "dagjose.EncodedSignature"}.AsFloat() +} +func (EncodedSignature) AsString() (string, error) { + return mixins.Map{TypeName: "dagjose.EncodedSignature"}.AsString() +} +func (EncodedSignature) AsBytes() ([]byte, error) { + return mixins.Map{TypeName: "dagjose.EncodedSignature"}.AsBytes() +} +func (EncodedSignature) AsLink() (datamodel.Link, error) { + return mixins.Map{TypeName: "dagjose.EncodedSignature"}.AsLink() +} +func (EncodedSignature) Prototype() datamodel.NodePrototype { + return _EncodedSignature__Prototype{} +} + +type _EncodedSignature__Prototype struct{} + +func (_EncodedSignature__Prototype) NewBuilder() datamodel.NodeBuilder { + var nb _EncodedSignature__Builder + nb.Reset() + return &nb +} + +type _EncodedSignature__Builder struct { + _EncodedSignature__Assembler +} + +func (nb *_EncodedSignature__Builder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_EncodedSignature__Builder) Reset() { + var w _EncodedSignature + var m schema.Maybe + *nb = _EncodedSignature__Builder{_EncodedSignature__Assembler{w: &w, m: &m}} +} + +type _EncodedSignature__Assembler struct { + w *_EncodedSignature + m *schema.Maybe + state maState + s int + f int + + cm schema.Maybe + ca_header _Any__Assembler + ca_protected _Raw__Assembler + ca_signature _Raw__Assembler +} + +func (na *_EncodedSignature__Assembler) reset() { + na.state = maState_initial + na.s = 0 + na.ca_header.reset() + na.ca_protected.reset() + na.ca_signature.reset() +} + +var ( + fieldBit__EncodedSignature_Header = 1 << 0 + fieldBit__EncodedSignature_Protected = 1 << 1 + fieldBit__EncodedSignature_Signature = 1 << 2 + fieldBits__EncodedSignature_sufficient = 0 + 1<<2 +) + +func (na *_EncodedSignature__Assembler) BeginMap(int64) (datamodel.MapAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if na.w == nil { + na.w = &_EncodedSignature{} + } + return na, nil +} +func (_EncodedSignature__Assembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.MapAssembler{TypeName: "dagjose.EncodedSignature"}.BeginList(0) +} +func (na *_EncodedSignature__Assembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.MapAssembler{TypeName: "dagjose.EncodedSignature"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_EncodedSignature__Assembler) AssignBool(bool) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedSignature"}.AssignBool(false) +} +func (_EncodedSignature__Assembler) AssignInt(int64) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedSignature"}.AssignInt(0) +} +func (_EncodedSignature__Assembler) AssignFloat(float64) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedSignature"}.AssignFloat(0) +} +func (_EncodedSignature__Assembler) AssignString(string) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedSignature"}.AssignString("") +} +func (_EncodedSignature__Assembler) AssignBytes([]byte) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedSignature"}.AssignBytes(nil) +} +func (_EncodedSignature__Assembler) AssignLink(datamodel.Link) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedSignature"}.AssignLink(nil) +} +func (na *_EncodedSignature__Assembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_EncodedSignature); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + if na.w == nil { + na.w = v2 + *na.m = schema.Maybe_Value + return nil + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_Map { + return datamodel.ErrWrongKind{TypeName: "dagjose.EncodedSignature", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustMap, ActualKind: v.Kind()} + } + itr := v.MapIterator() + for !itr.Done() { + k, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleKey().AssignNode(k); err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_EncodedSignature__Assembler) Prototype() datamodel.NodePrototype { + return _EncodedSignature__Prototype{} +} +func (ma *_EncodedSignature__Assembler) valueFinishTidy() bool { + switch ma.f { + case 0: + switch ma.w.header.m { + case schema.Maybe_Value: + ma.w.header.v = ma.ca_header.w + ma.state = maState_initial + return true + default: + return false + } + case 1: + switch ma.w.protected.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 2: + switch ma.cm { + case schema.Maybe_Value: + ma.ca_signature.w = nil + ma.cm = schema.Maybe_Absent + ma.state = maState_initial + return true + default: + return false + } + default: + panic("unreachable") + } +} +func (ma *_EncodedSignature__Assembler) AssembleEntry(k string) (datamodel.NodeAssembler, error) { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleEntry cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleEntry cannot be called on an assembler that's already finished") + } + switch k { + case "header": + if ma.s&fieldBit__EncodedSignature_Header != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedSignature_Header} + } + ma.s += fieldBit__EncodedSignature_Header + ma.state = maState_midValue + ma.f = 0 + ma.ca_header.w = ma.w.header.v + ma.ca_header.m = &ma.w.header.m + return &ma.ca_header, nil + case "protected": + if ma.s&fieldBit__EncodedSignature_Protected != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedSignature_Protected} + } + ma.s += fieldBit__EncodedSignature_Protected + ma.state = maState_midValue + ma.f = 1 + ma.ca_protected.w = &ma.w.protected.v + ma.ca_protected.m = &ma.w.protected.m + return &ma.ca_protected, nil + case "signature": + if ma.s&fieldBit__EncodedSignature_Signature != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedSignature_Signature} + } + ma.s += fieldBit__EncodedSignature_Signature + ma.state = maState_midValue + ma.f = 2 + ma.ca_signature.w = &ma.w.signature + ma.ca_signature.m = &ma.cm + return &ma.ca_signature, nil + } + return nil, schema.ErrInvalidKey{TypeName: "dagjose.EncodedSignature", Key: &_String{k}} +} +func (ma *_EncodedSignature__Assembler) AssembleKey() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleKey cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleKey cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleKey cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleKey cannot be called on an assembler that's already finished") + } + ma.state = maState_midKey + return (*_EncodedSignature__KeyAssembler)(ma) +} +func (ma *_EncodedSignature__Assembler) AssembleValue() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + panic("invalid state: AssembleValue cannot be called when no key is primed") + case maState_midKey: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling a key") + case maState_expectValue: + // carry on + case maState_midValue: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling another value") + case maState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + ma.state = maState_midValue + switch ma.f { + case 0: + ma.ca_header.w = ma.w.header.v + ma.ca_header.m = &ma.w.header.m + return &ma.ca_header + case 1: + ma.ca_protected.w = &ma.w.protected.v + ma.ca_protected.m = &ma.w.protected.m + return &ma.ca_protected + case 2: + ma.ca_signature.w = &ma.w.signature + ma.ca_signature.m = &ma.cm + return &ma.ca_signature + default: + panic("unreachable") + } +} +func (ma *_EncodedSignature__Assembler) Finish() error { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: Finish cannot be called when in the middle of assembling a key") + case maState_expectValue: + panic("invalid state: Finish cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + if ma.s&fieldBits__EncodedSignature_sufficient != fieldBits__EncodedSignature_sufficient { + err := schema.ErrMissingRequiredField{Missing: make([]string, 0)} + if ma.s&fieldBit__EncodedSignature_Signature == 0 { + err.Missing = append(err.Missing, "signature") + } + return err + } + ma.state = maState_finished + *ma.m = schema.Maybe_Value + return nil +} +func (ma *_EncodedSignature__Assembler) KeyPrototype() datamodel.NodePrototype { + return _String__Prototype{} +} +func (ma *_EncodedSignature__Assembler) ValuePrototype(k string) datamodel.NodePrototype { + panic("todo structbuilder mapassembler valueprototype") +} + +type _EncodedSignature__KeyAssembler _EncodedSignature__Assembler + +func (_EncodedSignature__KeyAssembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.EncodedSignature.KeyAssembler"}.BeginMap(0) +} +func (_EncodedSignature__KeyAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.EncodedSignature.KeyAssembler"}.BeginList(0) +} +func (na *_EncodedSignature__KeyAssembler) AssignNull() error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedSignature.KeyAssembler"}.AssignNull() +} +func (_EncodedSignature__KeyAssembler) AssignBool(bool) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedSignature.KeyAssembler"}.AssignBool(false) +} +func (_EncodedSignature__KeyAssembler) AssignInt(int64) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedSignature.KeyAssembler"}.AssignInt(0) +} +func (_EncodedSignature__KeyAssembler) AssignFloat(float64) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedSignature.KeyAssembler"}.AssignFloat(0) +} +func (ka *_EncodedSignature__KeyAssembler) AssignString(k string) error { + if ka.state != maState_midKey { + panic("misuse: KeyAssembler held beyond its valid lifetime") + } + switch k { + case "header": + if ka.s&fieldBit__EncodedSignature_Header != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedSignature_Header} + } + ka.s += fieldBit__EncodedSignature_Header + ka.state = maState_expectValue + ka.f = 0 + return nil + case "protected": + if ka.s&fieldBit__EncodedSignature_Protected != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedSignature_Protected} + } + ka.s += fieldBit__EncodedSignature_Protected + ka.state = maState_expectValue + ka.f = 1 + return nil + case "signature": + if ka.s&fieldBit__EncodedSignature_Signature != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedSignature_Signature} + } + ka.s += fieldBit__EncodedSignature_Signature + ka.state = maState_expectValue + ka.f = 2 + return nil + default: + return schema.ErrInvalidKey{TypeName: "dagjose.EncodedSignature", Key: &_String{k}} + } +} +func (_EncodedSignature__KeyAssembler) AssignBytes([]byte) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedSignature.KeyAssembler"}.AssignBytes(nil) +} +func (_EncodedSignature__KeyAssembler) AssignLink(datamodel.Link) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedSignature.KeyAssembler"}.AssignLink(nil) +} +func (ka *_EncodedSignature__KeyAssembler) AssignNode(v datamodel.Node) error { + if v2, err := v.AsString(); err != nil { + return err + } else { + return ka.AssignString(v2) + } +} +func (_EncodedSignature__KeyAssembler) Prototype() datamodel.NodePrototype { + return _String__Prototype{} +} +func (EncodedSignature) Type() schema.Type { + return nil /*TODO:typelit*/ +} +func (n EncodedSignature) Representation() datamodel.Node { + return (*_EncodedSignature__Repr)(n) +} + +type _EncodedSignature__Repr _EncodedSignature + +var ( + fieldName__EncodedSignature_Header_serial = _String{"header"} + fieldName__EncodedSignature_Protected_serial = _String{"protected"} + fieldName__EncodedSignature_Signature_serial = _String{"signature"} +) +var _ datamodel.Node = &_EncodedSignature__Repr{} + +func (_EncodedSignature__Repr) Kind() datamodel.Kind { + return datamodel.Kind_Map +} +func (n *_EncodedSignature__Repr) LookupByString(key string) (datamodel.Node, error) { + switch key { + case "header": + if n.header.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.header.v.Representation(), nil + case "protected": + if n.protected.m == schema.Maybe_Absent { + return datamodel.Absent, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(key)} + } + return n.protected.v.Representation(), nil + case "signature": + return n.signature.Representation(), nil + default: + return nil, schema.ErrNoSuchField{Type: nil /*TODO*/, Field: datamodel.PathSegmentOfString(key)} + } +} +func (n *_EncodedSignature__Repr) LookupByNode(key datamodel.Node) (datamodel.Node, error) { + ks, err := key.AsString() + if err != nil { + return nil, err + } + return n.LookupByString(ks) +} +func (_EncodedSignature__Repr) LookupByIndex(idx int64) (datamodel.Node, error) { + return mixins.Map{TypeName: "dagjose.EncodedSignature.Repr"}.LookupByIndex(0) +} +func (n _EncodedSignature__Repr) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + return n.LookupByString(seg.String()) +} +func (n *_EncodedSignature__Repr) MapIterator() datamodel.MapIterator { + return &_EncodedSignature__ReprMapItr{n, 0} +} + +type _EncodedSignature__ReprMapItr struct { + n *_EncodedSignature__Repr + idx int +} + +func (itr *_EncodedSignature__ReprMapItr) Next() (k datamodel.Node, v datamodel.Node, _ error) { +advance: + if itr.idx >= 3 { + return nil, nil, datamodel.ErrIteratorOverread{} + } + switch itr.idx { + case 0: + k = &fieldName__EncodedSignature_Header_serial + if itr.n.header.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.header.v.Representation() + case 1: + k = &fieldName__EncodedSignature_Protected_serial + if itr.n.protected.m == schema.Maybe_Absent { + itr.idx++ + goto advance + } + v = itr.n.protected.v.Representation() + case 2: + k = &fieldName__EncodedSignature_Signature_serial + v = itr.n.signature.Representation() + default: + panic("unreachable") + } + itr.idx++ + return +} +func (itr *_EncodedSignature__ReprMapItr) Done() bool { + return itr.idx >= 3 +} +func (_EncodedSignature__Repr) ListIterator() datamodel.ListIterator { + return nil +} +func (rn *_EncodedSignature__Repr) Length() int64 { + l := 3 + if rn.header.m == schema.Maybe_Absent { + l-- + } + if rn.protected.m == schema.Maybe_Absent { + l-- + } + return int64(l) +} +func (_EncodedSignature__Repr) IsAbsent() bool { + return false +} +func (_EncodedSignature__Repr) IsNull() bool { + return false +} +func (_EncodedSignature__Repr) AsBool() (bool, error) { + return mixins.Map{TypeName: "dagjose.EncodedSignature.Repr"}.AsBool() +} +func (_EncodedSignature__Repr) AsInt() (int64, error) { + return mixins.Map{TypeName: "dagjose.EncodedSignature.Repr"}.AsInt() +} +func (_EncodedSignature__Repr) AsFloat() (float64, error) { + return mixins.Map{TypeName: "dagjose.EncodedSignature.Repr"}.AsFloat() +} +func (_EncodedSignature__Repr) AsString() (string, error) { + return mixins.Map{TypeName: "dagjose.EncodedSignature.Repr"}.AsString() +} +func (_EncodedSignature__Repr) AsBytes() ([]byte, error) { + return mixins.Map{TypeName: "dagjose.EncodedSignature.Repr"}.AsBytes() +} +func (_EncodedSignature__Repr) AsLink() (datamodel.Link, error) { + return mixins.Map{TypeName: "dagjose.EncodedSignature.Repr"}.AsLink() +} +func (_EncodedSignature__Repr) Prototype() datamodel.NodePrototype { + return _EncodedSignature__ReprPrototype{} +} + +type _EncodedSignature__ReprPrototype struct{} + +func (_EncodedSignature__ReprPrototype) NewBuilder() datamodel.NodeBuilder { + var nb _EncodedSignature__ReprBuilder + nb.Reset() + return &nb +} + +type _EncodedSignature__ReprBuilder struct { + _EncodedSignature__ReprAssembler +} + +func (nb *_EncodedSignature__ReprBuilder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_EncodedSignature__ReprBuilder) Reset() { + var w _EncodedSignature + var m schema.Maybe + *nb = _EncodedSignature__ReprBuilder{_EncodedSignature__ReprAssembler{w: &w, m: &m}} +} + +type _EncodedSignature__ReprAssembler struct { + w *_EncodedSignature + m *schema.Maybe + state maState + s int + f int + + cm schema.Maybe + ca_header _Any__ReprAssembler + ca_protected _Raw__ReprAssembler + ca_signature _Raw__ReprAssembler +} + +func (na *_EncodedSignature__ReprAssembler) reset() { + na.state = maState_initial + na.s = 0 + na.ca_header.reset() + na.ca_protected.reset() + na.ca_signature.reset() +} +func (na *_EncodedSignature__ReprAssembler) BeginMap(int64) (datamodel.MapAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if na.w == nil { + na.w = &_EncodedSignature{} + } + return na, nil +} +func (_EncodedSignature__ReprAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.MapAssembler{TypeName: "dagjose.EncodedSignature.Repr"}.BeginList(0) +} +func (na *_EncodedSignature__ReprAssembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.MapAssembler{TypeName: "dagjose.EncodedSignature.Repr.Repr"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_EncodedSignature__ReprAssembler) AssignBool(bool) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedSignature.Repr"}.AssignBool(false) +} +func (_EncodedSignature__ReprAssembler) AssignInt(int64) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedSignature.Repr"}.AssignInt(0) +} +func (_EncodedSignature__ReprAssembler) AssignFloat(float64) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedSignature.Repr"}.AssignFloat(0) +} +func (_EncodedSignature__ReprAssembler) AssignString(string) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedSignature.Repr"}.AssignString("") +} +func (_EncodedSignature__ReprAssembler) AssignBytes([]byte) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedSignature.Repr"}.AssignBytes(nil) +} +func (_EncodedSignature__ReprAssembler) AssignLink(datamodel.Link) error { + return mixins.MapAssembler{TypeName: "dagjose.EncodedSignature.Repr"}.AssignLink(nil) +} +func (na *_EncodedSignature__ReprAssembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_EncodedSignature); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + if na.w == nil { + na.w = v2 + *na.m = schema.Maybe_Value + return nil + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_Map { + return datamodel.ErrWrongKind{TypeName: "dagjose.EncodedSignature.Repr", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustMap, ActualKind: v.Kind()} + } + itr := v.MapIterator() + for !itr.Done() { + k, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleKey().AssignNode(k); err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_EncodedSignature__ReprAssembler) Prototype() datamodel.NodePrototype { + return _EncodedSignature__ReprPrototype{} +} +func (ma *_EncodedSignature__ReprAssembler) valueFinishTidy() bool { + switch ma.f { + case 0: + switch ma.w.header.m { + case schema.Maybe_Value: + ma.w.header.v = ma.ca_header.w + ma.state = maState_initial + return true + default: + return false + } + case 1: + switch ma.w.protected.m { + case schema.Maybe_Value: + ma.state = maState_initial + return true + default: + return false + } + case 2: + switch ma.cm { + case schema.Maybe_Value: + ma.cm = schema.Maybe_Absent + ma.state = maState_initial + return true + default: + return false + } + default: + panic("unreachable") + } +} +func (ma *_EncodedSignature__ReprAssembler) AssembleEntry(k string) (datamodel.NodeAssembler, error) { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleEntry cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleEntry cannot be called on an assembler that's already finished") + } + switch k { + case "header": + if ma.s&fieldBit__EncodedSignature_Header != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedSignature_Header_serial} + } + ma.s += fieldBit__EncodedSignature_Header + ma.state = maState_midValue + ma.f = 0 + ma.ca_header.w = ma.w.header.v + ma.ca_header.m = &ma.w.header.m + + return &ma.ca_header, nil + case "protected": + if ma.s&fieldBit__EncodedSignature_Protected != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedSignature_Protected_serial} + } + ma.s += fieldBit__EncodedSignature_Protected + ma.state = maState_midValue + ma.f = 1 + ma.ca_protected.w = &ma.w.protected.v + ma.ca_protected.m = &ma.w.protected.m + + return &ma.ca_protected, nil + case "signature": + if ma.s&fieldBit__EncodedSignature_Signature != 0 { + return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedSignature_Signature_serial} + } + ma.s += fieldBit__EncodedSignature_Signature + ma.state = maState_midValue + ma.f = 2 + ma.ca_signature.w = &ma.w.signature + ma.ca_signature.m = &ma.cm + return &ma.ca_signature, nil + default: + } + return nil, schema.ErrInvalidKey{TypeName: "dagjose.EncodedSignature.Repr", Key: &_String{k}} +} +func (ma *_EncodedSignature__ReprAssembler) AssembleKey() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleKey cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleKey cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleKey cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleKey cannot be called on an assembler that's already finished") + } + ma.state = maState_midKey + return (*_EncodedSignature__ReprKeyAssembler)(ma) +} +func (ma *_EncodedSignature__ReprAssembler) AssembleValue() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + panic("invalid state: AssembleValue cannot be called when no key is primed") + case maState_midKey: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling a key") + case maState_expectValue: + // carry on + case maState_midValue: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling another value") + case maState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + ma.state = maState_midValue + switch ma.f { + case 0: + ma.ca_header.w = ma.w.header.v + ma.ca_header.m = &ma.w.header.m + + return &ma.ca_header + case 1: + ma.ca_protected.w = &ma.w.protected.v + ma.ca_protected.m = &ma.w.protected.m + + return &ma.ca_protected + case 2: + ma.ca_signature.w = &ma.w.signature + ma.ca_signature.m = &ma.cm + return &ma.ca_signature + default: + panic("unreachable") + } +} +func (ma *_EncodedSignature__ReprAssembler) Finish() error { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: Finish cannot be called when in the middle of assembling a key") + case maState_expectValue: + panic("invalid state: Finish cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + if ma.s&fieldBits__EncodedSignature_sufficient != fieldBits__EncodedSignature_sufficient { + err := schema.ErrMissingRequiredField{Missing: make([]string, 0)} + if ma.s&fieldBit__EncodedSignature_Signature == 0 { + err.Missing = append(err.Missing, "signature") + } + return err + } + ma.state = maState_finished + *ma.m = schema.Maybe_Value + return nil +} +func (ma *_EncodedSignature__ReprAssembler) KeyPrototype() datamodel.NodePrototype { + return _String__Prototype{} +} +func (ma *_EncodedSignature__ReprAssembler) ValuePrototype(k string) datamodel.NodePrototype { + panic("todo structbuilder mapassembler repr valueprototype") +} + +type _EncodedSignature__ReprKeyAssembler _EncodedSignature__ReprAssembler + +func (_EncodedSignature__ReprKeyAssembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.EncodedSignature.Repr.KeyAssembler"}.BeginMap(0) +} +func (_EncodedSignature__ReprKeyAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.EncodedSignature.Repr.KeyAssembler"}.BeginList(0) +} +func (na *_EncodedSignature__ReprKeyAssembler) AssignNull() error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedSignature.Repr.KeyAssembler"}.AssignNull() +} +func (_EncodedSignature__ReprKeyAssembler) AssignBool(bool) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedSignature.Repr.KeyAssembler"}.AssignBool(false) +} +func (_EncodedSignature__ReprKeyAssembler) AssignInt(int64) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedSignature.Repr.KeyAssembler"}.AssignInt(0) +} +func (_EncodedSignature__ReprKeyAssembler) AssignFloat(float64) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedSignature.Repr.KeyAssembler"}.AssignFloat(0) +} +func (ka *_EncodedSignature__ReprKeyAssembler) AssignString(k string) error { + if ka.state != maState_midKey { + panic("misuse: KeyAssembler held beyond its valid lifetime") + } + switch k { + case "header": + if ka.s&fieldBit__EncodedSignature_Header != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedSignature_Header_serial} + } + ka.s += fieldBit__EncodedSignature_Header + ka.state = maState_expectValue + ka.f = 0 + return nil + case "protected": + if ka.s&fieldBit__EncodedSignature_Protected != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedSignature_Protected_serial} + } + ka.s += fieldBit__EncodedSignature_Protected + ka.state = maState_expectValue + ka.f = 1 + return nil + case "signature": + if ka.s&fieldBit__EncodedSignature_Signature != 0 { + return datamodel.ErrRepeatedMapKey{Key: &fieldName__EncodedSignature_Signature_serial} + } + ka.s += fieldBit__EncodedSignature_Signature + ka.state = maState_expectValue + ka.f = 2 + return nil + } + return schema.ErrInvalidKey{TypeName: "dagjose.EncodedSignature.Repr", Key: &_String{k}} +} +func (_EncodedSignature__ReprKeyAssembler) AssignBytes([]byte) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedSignature.Repr.KeyAssembler"}.AssignBytes(nil) +} +func (_EncodedSignature__ReprKeyAssembler) AssignLink(datamodel.Link) error { + return mixins.StringAssembler{TypeName: "dagjose.EncodedSignature.Repr.KeyAssembler"}.AssignLink(nil) +} +func (ka *_EncodedSignature__ReprKeyAssembler) AssignNode(v datamodel.Node) error { + if v2, err := v.AsString(); err != nil { + return err + } else { + return ka.AssignString(v2) + } +} +func (_EncodedSignature__ReprKeyAssembler) Prototype() datamodel.NodePrototype { + return _String__Prototype{} +} + +func (n *_EncodedSignatures) Lookup(idx int64) EncodedSignature { + if n.Length() <= idx { + return nil + } + v := &n.x[idx] + return v +} +func (n *_EncodedSignatures) LookupMaybe(idx int64) MaybeEncodedSignature { + if n.Length() <= idx { + return nil + } + v := &n.x[idx] + return &_EncodedSignature__Maybe{ + m: schema.Maybe_Value, + v: v, + } +} + +var _EncodedSignatures__valueAbsent = _EncodedSignature__Maybe{m: schema.Maybe_Absent} + +func (n EncodedSignatures) Iterator() *EncodedSignatures__Itr { + return &EncodedSignatures__Itr{n, 0} +} + +type EncodedSignatures__Itr struct { + n EncodedSignatures + idx int +} + +func (itr *EncodedSignatures__Itr) Next() (idx int64, v EncodedSignature) { + if itr.idx >= len(itr.n.x) { + return -1, nil + } + idx = int64(itr.idx) + v = &itr.n.x[itr.idx] + itr.idx++ + return +} +func (itr *EncodedSignatures__Itr) Done() bool { + return itr.idx >= len(itr.n.x) +} + +type _EncodedSignatures__Maybe struct { + m schema.Maybe + v _EncodedSignatures +} +type MaybeEncodedSignatures = *_EncodedSignatures__Maybe + +func (m MaybeEncodedSignatures) IsNull() bool { + return m.m == schema.Maybe_Null +} +func (m MaybeEncodedSignatures) IsAbsent() bool { + return m.m == schema.Maybe_Absent +} +func (m MaybeEncodedSignatures) Exists() bool { + return m.m == schema.Maybe_Value +} +func (m MaybeEncodedSignatures) AsNode() datamodel.Node { + switch m.m { + case schema.Maybe_Absent: + return datamodel.Absent + case schema.Maybe_Null: + return datamodel.Null + case schema.Maybe_Value: + return &m.v + default: + panic("unreachable") + } +} +func (m MaybeEncodedSignatures) Must() EncodedSignatures { + if !m.Exists() { + panic("unbox of a maybe rejected") + } + return &m.v +} + +var _ datamodel.Node = (EncodedSignatures)(&_EncodedSignatures{}) +var _ schema.TypedNode = (EncodedSignatures)(&_EncodedSignatures{}) + +func (EncodedSignatures) Kind() datamodel.Kind { + return datamodel.Kind_List +} +func (EncodedSignatures) LookupByString(string) (datamodel.Node, error) { + return mixins.List{TypeName: "dagjose.EncodedSignatures"}.LookupByString("") +} +func (n EncodedSignatures) LookupByNode(k datamodel.Node) (datamodel.Node, error) { + idx, err := k.AsInt() + if err != nil { + return nil, err + } + return n.LookupByIndex(idx) +} +func (n EncodedSignatures) LookupByIndex(idx int64) (datamodel.Node, error) { + if n.Length() <= idx { + return nil, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfInt(idx)} + } + v := &n.x[idx] + return v, nil +} +func (n EncodedSignatures) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + i, err := seg.Index() + if err != nil { + return nil, datamodel.ErrInvalidSegmentForList{TypeName: "dagjose.EncodedSignatures", TroubleSegment: seg, Reason: err} + } + return n.LookupByIndex(i) +} +func (EncodedSignatures) MapIterator() datamodel.MapIterator { + return nil +} +func (n EncodedSignatures) ListIterator() datamodel.ListIterator { + return &_EncodedSignatures__ListItr{n, 0} +} + +type _EncodedSignatures__ListItr struct { + n EncodedSignatures + idx int +} + +func (itr *_EncodedSignatures__ListItr) Next() (idx int64, v datamodel.Node, _ error) { + if itr.idx >= len(itr.n.x) { + return -1, nil, datamodel.ErrIteratorOverread{} + } + idx = int64(itr.idx) + x := &itr.n.x[itr.idx] + v = x + itr.idx++ + return +} +func (itr *_EncodedSignatures__ListItr) Done() bool { + return itr.idx >= len(itr.n.x) +} + +func (n EncodedSignatures) Length() int64 { + return int64(len(n.x)) +} +func (EncodedSignatures) IsAbsent() bool { + return false +} +func (EncodedSignatures) IsNull() bool { + return false +} +func (EncodedSignatures) AsBool() (bool, error) { + return mixins.List{TypeName: "dagjose.EncodedSignatures"}.AsBool() +} +func (EncodedSignatures) AsInt() (int64, error) { + return mixins.List{TypeName: "dagjose.EncodedSignatures"}.AsInt() +} +func (EncodedSignatures) AsFloat() (float64, error) { + return mixins.List{TypeName: "dagjose.EncodedSignatures"}.AsFloat() +} +func (EncodedSignatures) AsString() (string, error) { + return mixins.List{TypeName: "dagjose.EncodedSignatures"}.AsString() +} +func (EncodedSignatures) AsBytes() ([]byte, error) { + return mixins.List{TypeName: "dagjose.EncodedSignatures"}.AsBytes() +} +func (EncodedSignatures) AsLink() (datamodel.Link, error) { + return mixins.List{TypeName: "dagjose.EncodedSignatures"}.AsLink() +} +func (EncodedSignatures) Prototype() datamodel.NodePrototype { + return _EncodedSignatures__Prototype{} +} + +type _EncodedSignatures__Prototype struct{} + +func (_EncodedSignatures__Prototype) NewBuilder() datamodel.NodeBuilder { + var nb _EncodedSignatures__Builder + nb.Reset() + return &nb +} + +type _EncodedSignatures__Builder struct { + _EncodedSignatures__Assembler +} + +func (nb *_EncodedSignatures__Builder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_EncodedSignatures__Builder) Reset() { + var w _EncodedSignatures + var m schema.Maybe + *nb = _EncodedSignatures__Builder{_EncodedSignatures__Assembler{w: &w, m: &m}} +} + +type _EncodedSignatures__Assembler struct { + w *_EncodedSignatures + m *schema.Maybe + state laState + + cm schema.Maybe + va _EncodedSignature__Assembler +} + +func (na *_EncodedSignatures__Assembler) reset() { + na.state = laState_initial + na.va.reset() +} +func (_EncodedSignatures__Assembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.ListAssembler{TypeName: "dagjose.EncodedSignatures"}.BeginMap(0) +} +func (na *_EncodedSignatures__Assembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if sizeHint < 0 { + sizeHint = 0 + } + if sizeHint > 0 { + na.w.x = make([]_EncodedSignature, 0, sizeHint) + } + return na, nil +} +func (na *_EncodedSignatures__Assembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.ListAssembler{TypeName: "dagjose.EncodedSignatures"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_EncodedSignatures__Assembler) AssignBool(bool) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedSignatures"}.AssignBool(false) +} +func (_EncodedSignatures__Assembler) AssignInt(int64) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedSignatures"}.AssignInt(0) +} +func (_EncodedSignatures__Assembler) AssignFloat(float64) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedSignatures"}.AssignFloat(0) +} +func (_EncodedSignatures__Assembler) AssignString(string) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedSignatures"}.AssignString("") +} +func (_EncodedSignatures__Assembler) AssignBytes([]byte) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedSignatures"}.AssignBytes(nil) +} +func (_EncodedSignatures__Assembler) AssignLink(datamodel.Link) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedSignatures"}.AssignLink(nil) +} +func (na *_EncodedSignatures__Assembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_EncodedSignatures); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_List { + return datamodel.ErrWrongKind{TypeName: "dagjose.EncodedSignatures", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustList, ActualKind: v.Kind()} + } + itr := v.ListIterator() + for !itr.Done() { + _, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_EncodedSignatures__Assembler) Prototype() datamodel.NodePrototype { + return _EncodedSignatures__Prototype{} +} +func (la *_EncodedSignatures__Assembler) valueFinishTidy() bool { + switch la.cm { + case schema.Maybe_Value: + la.va.w = nil + la.cm = schema.Maybe_Absent + la.state = laState_initial + la.va.reset() + return true + default: + return false + } +} +func (la *_EncodedSignatures__Assembler) AssembleValue() datamodel.NodeAssembler { + switch la.state { + case laState_initial: + // carry on + case laState_midValue: + if !la.valueFinishTidy() { + panic("invalid state: AssembleValue cannot be called when still in the middle of assembling the previous value") + } // if tidy success: carry on + case laState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + la.w.x = append(la.w.x, _EncodedSignature{}) + la.state = laState_midValue + row := &la.w.x[len(la.w.x)-1] + la.va.w = row + la.va.m = &la.cm + return &la.va +} +func (la *_EncodedSignatures__Assembler) Finish() error { + switch la.state { + case laState_initial: + // carry on + case laState_midValue: + if !la.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case laState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + la.state = laState_finished + *la.m = schema.Maybe_Value + return nil +} +func (la *_EncodedSignatures__Assembler) ValuePrototype(_ int64) datamodel.NodePrototype { + return _EncodedSignature__Prototype{} +} +func (EncodedSignatures) Type() schema.Type { + return nil /*TODO:typelit*/ +} +func (n EncodedSignatures) Representation() datamodel.Node { + return (*_EncodedSignatures__Repr)(n) +} + +type _EncodedSignatures__Repr _EncodedSignatures + +var _ datamodel.Node = &_EncodedSignatures__Repr{} + +func (_EncodedSignatures__Repr) Kind() datamodel.Kind { + return datamodel.Kind_List +} +func (_EncodedSignatures__Repr) LookupByString(string) (datamodel.Node, error) { + return mixins.List{TypeName: "dagjose.EncodedSignatures.Repr"}.LookupByString("") +} +func (nr *_EncodedSignatures__Repr) LookupByNode(k datamodel.Node) (datamodel.Node, error) { + v, err := (EncodedSignatures)(nr).LookupByNode(k) + if err != nil || v == datamodel.Null { + return v, err + } + return v.(EncodedSignature).Representation(), nil +} +func (nr *_EncodedSignatures__Repr) LookupByIndex(idx int64) (datamodel.Node, error) { + v, err := (EncodedSignatures)(nr).LookupByIndex(idx) + if err != nil || v == datamodel.Null { + return v, err + } + return v.(EncodedSignature).Representation(), nil +} +func (n _EncodedSignatures__Repr) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + i, err := seg.Index() + if err != nil { + return nil, datamodel.ErrInvalidSegmentForList{TypeName: "dagjose.EncodedSignatures.Repr", TroubleSegment: seg, Reason: err} + } + return n.LookupByIndex(i) +} +func (_EncodedSignatures__Repr) MapIterator() datamodel.MapIterator { + return nil +} +func (nr *_EncodedSignatures__Repr) ListIterator() datamodel.ListIterator { + return &_EncodedSignatures__ReprListItr{(EncodedSignatures)(nr), 0} +} + +type _EncodedSignatures__ReprListItr _EncodedSignatures__ListItr + +func (itr *_EncodedSignatures__ReprListItr) Next() (idx int64, v datamodel.Node, err error) { + idx, v, err = (*_EncodedSignatures__ListItr)(itr).Next() + if err != nil || v == datamodel.Null { + return + } + return idx, v.(EncodedSignature).Representation(), nil +} +func (itr *_EncodedSignatures__ReprListItr) Done() bool { + return (*_EncodedSignatures__ListItr)(itr).Done() +} + +func (rn *_EncodedSignatures__Repr) Length() int64 { + return int64(len(rn.x)) +} +func (_EncodedSignatures__Repr) IsAbsent() bool { + return false +} +func (_EncodedSignatures__Repr) IsNull() bool { + return false +} +func (_EncodedSignatures__Repr) AsBool() (bool, error) { + return mixins.List{TypeName: "dagjose.EncodedSignatures.Repr"}.AsBool() +} +func (_EncodedSignatures__Repr) AsInt() (int64, error) { + return mixins.List{TypeName: "dagjose.EncodedSignatures.Repr"}.AsInt() +} +func (_EncodedSignatures__Repr) AsFloat() (float64, error) { + return mixins.List{TypeName: "dagjose.EncodedSignatures.Repr"}.AsFloat() +} +func (_EncodedSignatures__Repr) AsString() (string, error) { + return mixins.List{TypeName: "dagjose.EncodedSignatures.Repr"}.AsString() +} +func (_EncodedSignatures__Repr) AsBytes() ([]byte, error) { + return mixins.List{TypeName: "dagjose.EncodedSignatures.Repr"}.AsBytes() +} +func (_EncodedSignatures__Repr) AsLink() (datamodel.Link, error) { + return mixins.List{TypeName: "dagjose.EncodedSignatures.Repr"}.AsLink() +} +func (_EncodedSignatures__Repr) Prototype() datamodel.NodePrototype { + return _EncodedSignatures__ReprPrototype{} +} + +type _EncodedSignatures__ReprPrototype struct{} + +func (_EncodedSignatures__ReprPrototype) NewBuilder() datamodel.NodeBuilder { + var nb _EncodedSignatures__ReprBuilder + nb.Reset() + return &nb +} + +type _EncodedSignatures__ReprBuilder struct { + _EncodedSignatures__ReprAssembler +} + +func (nb *_EncodedSignatures__ReprBuilder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_EncodedSignatures__ReprBuilder) Reset() { + var w _EncodedSignatures + var m schema.Maybe + *nb = _EncodedSignatures__ReprBuilder{_EncodedSignatures__ReprAssembler{w: &w, m: &m}} +} + +type _EncodedSignatures__ReprAssembler struct { + w *_EncodedSignatures + m *schema.Maybe + state laState + + cm schema.Maybe + va _EncodedSignature__ReprAssembler +} + +func (na *_EncodedSignatures__ReprAssembler) reset() { + na.state = laState_initial + na.va.reset() +} +func (_EncodedSignatures__ReprAssembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.ListAssembler{TypeName: "dagjose.EncodedSignatures.Repr"}.BeginMap(0) +} +func (na *_EncodedSignatures__ReprAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if sizeHint < 0 { + sizeHint = 0 + } + if sizeHint > 0 { + na.w.x = make([]_EncodedSignature, 0, sizeHint) + } + return na, nil +} +func (na *_EncodedSignatures__ReprAssembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.ListAssembler{TypeName: "dagjose.EncodedSignatures.Repr.Repr"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_EncodedSignatures__ReprAssembler) AssignBool(bool) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedSignatures.Repr"}.AssignBool(false) +} +func (_EncodedSignatures__ReprAssembler) AssignInt(int64) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedSignatures.Repr"}.AssignInt(0) +} +func (_EncodedSignatures__ReprAssembler) AssignFloat(float64) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedSignatures.Repr"}.AssignFloat(0) +} +func (_EncodedSignatures__ReprAssembler) AssignString(string) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedSignatures.Repr"}.AssignString("") +} +func (_EncodedSignatures__ReprAssembler) AssignBytes([]byte) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedSignatures.Repr"}.AssignBytes(nil) +} +func (_EncodedSignatures__ReprAssembler) AssignLink(datamodel.Link) error { + return mixins.ListAssembler{TypeName: "dagjose.EncodedSignatures.Repr"}.AssignLink(nil) +} +func (na *_EncodedSignatures__ReprAssembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_EncodedSignatures); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_List { + return datamodel.ErrWrongKind{TypeName: "dagjose.EncodedSignatures.Repr", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustList, ActualKind: v.Kind()} + } + itr := v.ListIterator() + for !itr.Done() { + _, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_EncodedSignatures__ReprAssembler) Prototype() datamodel.NodePrototype { + return _EncodedSignatures__ReprPrototype{} +} +func (la *_EncodedSignatures__ReprAssembler) valueFinishTidy() bool { + switch la.cm { + case schema.Maybe_Value: + la.va.w = nil + la.cm = schema.Maybe_Absent + la.state = laState_initial + la.va.reset() + return true + default: + return false + } +} +func (la *_EncodedSignatures__ReprAssembler) AssembleValue() datamodel.NodeAssembler { + switch la.state { + case laState_initial: + // carry on + case laState_midValue: + if !la.valueFinishTidy() { + panic("invalid state: AssembleValue cannot be called when still in the middle of assembling the previous value") + } // if tidy success: carry on + case laState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + la.w.x = append(la.w.x, _EncodedSignature{}) + la.state = laState_midValue + row := &la.w.x[len(la.w.x)-1] + la.va.w = row + la.va.m = &la.cm + return &la.va +} +func (la *_EncodedSignatures__ReprAssembler) Finish() error { + switch la.state { + case laState_initial: + // carry on + case laState_midValue: + if !la.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case laState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + la.state = laState_finished + *la.m = schema.Maybe_Value + return nil +} +func (la *_EncodedSignatures__ReprAssembler) ValuePrototype(_ int64) datamodel.NodePrototype { + return _EncodedSignature__ReprPrototype{} +} + +func (n Float) Float() float64 { + return n.x +} +func (_Float__Prototype) FromFloat(v float64) (Float, error) { + n := _Float{v} + return &n, nil +} + +type _Float__Maybe struct { + m schema.Maybe + v _Float +} +type MaybeFloat = *_Float__Maybe + +func (m MaybeFloat) IsNull() bool { + return m.m == schema.Maybe_Null +} +func (m MaybeFloat) IsAbsent() bool { + return m.m == schema.Maybe_Absent +} +func (m MaybeFloat) Exists() bool { + return m.m == schema.Maybe_Value +} +func (m MaybeFloat) AsNode() datamodel.Node { + switch m.m { + case schema.Maybe_Absent: + return datamodel.Absent + case schema.Maybe_Null: + return datamodel.Null + case schema.Maybe_Value: + return &m.v + default: + panic("unreachable") + } +} +func (m MaybeFloat) Must() Float { + if !m.Exists() { + panic("unbox of a maybe rejected") + } + return &m.v +} + +var _ datamodel.Node = (Float)(&_Float{}) +var _ schema.TypedNode = (Float)(&_Float{}) + +func (Float) Kind() datamodel.Kind { + return datamodel.Kind_Float +} +func (Float) LookupByString(string) (datamodel.Node, error) { + return mixins.Float{TypeName: "dagjose.Float"}.LookupByString("") +} +func (Float) LookupByNode(datamodel.Node) (datamodel.Node, error) { + return mixins.Float{TypeName: "dagjose.Float"}.LookupByNode(nil) +} +func (Float) LookupByIndex(idx int64) (datamodel.Node, error) { + return mixins.Float{TypeName: "dagjose.Float"}.LookupByIndex(0) +} +func (Float) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + return mixins.Float{TypeName: "dagjose.Float"}.LookupBySegment(seg) +} +func (Float) MapIterator() datamodel.MapIterator { + return nil +} +func (Float) ListIterator() datamodel.ListIterator { + return nil +} +func (Float) Length() int64 { + return -1 +} +func (Float) IsAbsent() bool { + return false +} +func (Float) IsNull() bool { + return false +} +func (Float) AsBool() (bool, error) { + return mixins.Float{TypeName: "dagjose.Float"}.AsBool() +} +func (Float) AsInt() (int64, error) { + return mixins.Float{TypeName: "dagjose.Float"}.AsInt() +} +func (n Float) AsFloat() (float64, error) { + return n.x, nil +} +func (Float) AsString() (string, error) { + return mixins.Float{TypeName: "dagjose.Float"}.AsString() +} +func (Float) AsBytes() ([]byte, error) { + return mixins.Float{TypeName: "dagjose.Float"}.AsBytes() +} +func (Float) AsLink() (datamodel.Link, error) { + return mixins.Float{TypeName: "dagjose.Float"}.AsLink() +} +func (Float) Prototype() datamodel.NodePrototype { + return _Float__Prototype{} +} + +type _Float__Prototype struct{} + +func (_Float__Prototype) NewBuilder() datamodel.NodeBuilder { + var nb _Float__Builder + nb.Reset() + return &nb +} + +type _Float__Builder struct { + _Float__Assembler +} + +func (nb *_Float__Builder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_Float__Builder) Reset() { + var w _Float + var m schema.Maybe + *nb = _Float__Builder{_Float__Assembler{w: &w, m: &m}} +} + +type _Float__Assembler struct { + w *_Float + m *schema.Maybe +} + +func (na *_Float__Assembler) reset() {} +func (_Float__Assembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.FloatAssembler{TypeName: "dagjose.Float"}.BeginMap(0) +} +func (_Float__Assembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.FloatAssembler{TypeName: "dagjose.Float"}.BeginList(0) +} +func (na *_Float__Assembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.FloatAssembler{TypeName: "dagjose.Float"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + panic("unreachable") +} +func (_Float__Assembler) AssignBool(bool) error { + return mixins.FloatAssembler{TypeName: "dagjose.Float"}.AssignBool(false) +} +func (_Float__Assembler) AssignInt(int64) error { + return mixins.FloatAssembler{TypeName: "dagjose.Float"}.AssignInt(0) +} +func (na *_Float__Assembler) AssignFloat(v float64) error { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + na.w.x = v + *na.m = schema.Maybe_Value + return nil +} +func (_Float__Assembler) AssignString(string) error { + return mixins.FloatAssembler{TypeName: "dagjose.Float"}.AssignString("") +} +func (_Float__Assembler) AssignBytes([]byte) error { + return mixins.FloatAssembler{TypeName: "dagjose.Float"}.AssignBytes(nil) +} +func (_Float__Assembler) AssignLink(datamodel.Link) error { + return mixins.FloatAssembler{TypeName: "dagjose.Float"}.AssignLink(nil) +} +func (na *_Float__Assembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_Float); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v2, err := v.AsFloat(); err != nil { + return err + } else { + return na.AssignFloat(v2) + } +} +func (_Float__Assembler) Prototype() datamodel.NodePrototype { + return _Float__Prototype{} +} +func (Float) Type() schema.Type { + return nil /*TODO:typelit*/ +} +func (n Float) Representation() datamodel.Node { + return (*_Float__Repr)(n) +} + +type _Float__Repr = _Float + +var _ datamodel.Node = &_Float__Repr{} + +type _Float__ReprPrototype = _Float__Prototype +type _Float__ReprAssembler = _Float__Assembler + +func (n Int) Int() int64 { + return n.x +} +func (_Int__Prototype) FromInt(v int64) (Int, error) { + n := _Int{v} + return &n, nil +} + +type _Int__Maybe struct { + m schema.Maybe + v _Int +} +type MaybeInt = *_Int__Maybe + +func (m MaybeInt) IsNull() bool { + return m.m == schema.Maybe_Null +} +func (m MaybeInt) IsAbsent() bool { + return m.m == schema.Maybe_Absent +} +func (m MaybeInt) Exists() bool { + return m.m == schema.Maybe_Value +} +func (m MaybeInt) AsNode() datamodel.Node { + switch m.m { + case schema.Maybe_Absent: + return datamodel.Absent + case schema.Maybe_Null: + return datamodel.Null + case schema.Maybe_Value: + return &m.v + default: + panic("unreachable") + } +} +func (m MaybeInt) Must() Int { + if !m.Exists() { + panic("unbox of a maybe rejected") + } + return &m.v +} + +var _ datamodel.Node = (Int)(&_Int{}) +var _ schema.TypedNode = (Int)(&_Int{}) + +func (Int) Kind() datamodel.Kind { + return datamodel.Kind_Int +} +func (Int) LookupByString(string) (datamodel.Node, error) { + return mixins.Int{TypeName: "dagjose.Int"}.LookupByString("") +} +func (Int) LookupByNode(datamodel.Node) (datamodel.Node, error) { + return mixins.Int{TypeName: "dagjose.Int"}.LookupByNode(nil) +} +func (Int) LookupByIndex(idx int64) (datamodel.Node, error) { + return mixins.Int{TypeName: "dagjose.Int"}.LookupByIndex(0) +} +func (Int) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + return mixins.Int{TypeName: "dagjose.Int"}.LookupBySegment(seg) +} +func (Int) MapIterator() datamodel.MapIterator { + return nil +} +func (Int) ListIterator() datamodel.ListIterator { + return nil +} +func (Int) Length() int64 { + return -1 +} +func (Int) IsAbsent() bool { + return false +} +func (Int) IsNull() bool { + return false +} +func (Int) AsBool() (bool, error) { + return mixins.Int{TypeName: "dagjose.Int"}.AsBool() +} +func (n Int) AsInt() (int64, error) { + return n.x, nil +} +func (Int) AsFloat() (float64, error) { + return mixins.Int{TypeName: "dagjose.Int"}.AsFloat() +} +func (Int) AsString() (string, error) { + return mixins.Int{TypeName: "dagjose.Int"}.AsString() +} +func (Int) AsBytes() ([]byte, error) { + return mixins.Int{TypeName: "dagjose.Int"}.AsBytes() +} +func (Int) AsLink() (datamodel.Link, error) { + return mixins.Int{TypeName: "dagjose.Int"}.AsLink() +} +func (Int) Prototype() datamodel.NodePrototype { + return _Int__Prototype{} +} + +type _Int__Prototype struct{} + +func (_Int__Prototype) NewBuilder() datamodel.NodeBuilder { + var nb _Int__Builder + nb.Reset() + return &nb +} + +type _Int__Builder struct { + _Int__Assembler +} + +func (nb *_Int__Builder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_Int__Builder) Reset() { + var w _Int + var m schema.Maybe + *nb = _Int__Builder{_Int__Assembler{w: &w, m: &m}} +} + +type _Int__Assembler struct { + w *_Int + m *schema.Maybe +} + +func (na *_Int__Assembler) reset() {} +func (_Int__Assembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.IntAssembler{TypeName: "dagjose.Int"}.BeginMap(0) +} +func (_Int__Assembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.IntAssembler{TypeName: "dagjose.Int"}.BeginList(0) +} +func (na *_Int__Assembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.IntAssembler{TypeName: "dagjose.Int"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + panic("unreachable") +} +func (_Int__Assembler) AssignBool(bool) error { + return mixins.IntAssembler{TypeName: "dagjose.Int"}.AssignBool(false) +} +func (na *_Int__Assembler) AssignInt(v int64) error { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + na.w.x = v + *na.m = schema.Maybe_Value + return nil +} +func (_Int__Assembler) AssignFloat(float64) error { + return mixins.IntAssembler{TypeName: "dagjose.Int"}.AssignFloat(0) +} +func (_Int__Assembler) AssignString(string) error { + return mixins.IntAssembler{TypeName: "dagjose.Int"}.AssignString("") +} +func (_Int__Assembler) AssignBytes([]byte) error { + return mixins.IntAssembler{TypeName: "dagjose.Int"}.AssignBytes(nil) +} +func (_Int__Assembler) AssignLink(datamodel.Link) error { + return mixins.IntAssembler{TypeName: "dagjose.Int"}.AssignLink(nil) +} +func (na *_Int__Assembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_Int); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v2, err := v.AsInt(); err != nil { + return err + } else { + return na.AssignInt(v2) + } +} +func (_Int__Assembler) Prototype() datamodel.NodePrototype { + return _Int__Prototype{} +} +func (Int) Type() schema.Type { + return nil /*TODO:typelit*/ +} +func (n Int) Representation() datamodel.Node { + return (*_Int__Repr)(n) +} + +type _Int__Repr = _Int + +var _ datamodel.Node = &_Int__Repr{} + +type _Int__ReprPrototype = _Int__Prototype +type _Int__ReprAssembler = _Int__Assembler + +func (n Link) Link() datamodel.Link { + return n.x +} +func (_Link__Prototype) FromLink(v datamodel.Link) (Link, error) { + n := _Link{v} + return &n, nil +} + +type _Link__Maybe struct { + m schema.Maybe + v _Link +} +type MaybeLink = *_Link__Maybe + +func (m MaybeLink) IsNull() bool { + return m.m == schema.Maybe_Null +} +func (m MaybeLink) IsAbsent() bool { + return m.m == schema.Maybe_Absent +} +func (m MaybeLink) Exists() bool { + return m.m == schema.Maybe_Value +} +func (m MaybeLink) AsNode() datamodel.Node { + switch m.m { + case schema.Maybe_Absent: + return datamodel.Absent + case schema.Maybe_Null: + return datamodel.Null + case schema.Maybe_Value: + return &m.v + default: + panic("unreachable") + } +} +func (m MaybeLink) Must() Link { + if !m.Exists() { + panic("unbox of a maybe rejected") + } + return &m.v +} + +var _ datamodel.Node = (Link)(&_Link{}) +var _ schema.TypedNode = (Link)(&_Link{}) + +func (Link) Kind() datamodel.Kind { + return datamodel.Kind_Link +} +func (Link) LookupByString(string) (datamodel.Node, error) { + return mixins.Link{TypeName: "dagjose.Link"}.LookupByString("") +} +func (Link) LookupByNode(datamodel.Node) (datamodel.Node, error) { + return mixins.Link{TypeName: "dagjose.Link"}.LookupByNode(nil) +} +func (Link) LookupByIndex(idx int64) (datamodel.Node, error) { + return mixins.Link{TypeName: "dagjose.Link"}.LookupByIndex(0) +} +func (Link) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + return mixins.Link{TypeName: "dagjose.Link"}.LookupBySegment(seg) +} +func (Link) MapIterator() datamodel.MapIterator { + return nil +} +func (Link) ListIterator() datamodel.ListIterator { + return nil +} +func (Link) Length() int64 { + return -1 +} +func (Link) IsAbsent() bool { + return false +} +func (Link) IsNull() bool { + return false +} +func (Link) AsBool() (bool, error) { + return mixins.Link{TypeName: "dagjose.Link"}.AsBool() +} +func (Link) AsInt() (int64, error) { + return mixins.Link{TypeName: "dagjose.Link"}.AsInt() +} +func (Link) AsFloat() (float64, error) { + return mixins.Link{TypeName: "dagjose.Link"}.AsFloat() +} +func (Link) AsString() (string, error) { + return mixins.Link{TypeName: "dagjose.Link"}.AsString() +} +func (Link) AsBytes() ([]byte, error) { + return mixins.Link{TypeName: "dagjose.Link"}.AsBytes() +} +func (n Link) AsLink() (datamodel.Link, error) { + return n.x, nil +} +func (Link) Prototype() datamodel.NodePrototype { + return _Link__Prototype{} +} + +type _Link__Prototype struct{} + +func (_Link__Prototype) NewBuilder() datamodel.NodeBuilder { + var nb _Link__Builder + nb.Reset() + return &nb +} + +type _Link__Builder struct { + _Link__Assembler +} + +func (nb *_Link__Builder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_Link__Builder) Reset() { + var w _Link + var m schema.Maybe + *nb = _Link__Builder{_Link__Assembler{w: &w, m: &m}} +} + +type _Link__Assembler struct { + w *_Link + m *schema.Maybe +} + +func (na *_Link__Assembler) reset() {} +func (_Link__Assembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.LinkAssembler{TypeName: "dagjose.Link"}.BeginMap(0) +} +func (_Link__Assembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.LinkAssembler{TypeName: "dagjose.Link"}.BeginList(0) +} +func (na *_Link__Assembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.LinkAssembler{TypeName: "dagjose.Link"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + panic("unreachable") +} +func (_Link__Assembler) AssignBool(bool) error { + return mixins.LinkAssembler{TypeName: "dagjose.Link"}.AssignBool(false) +} +func (_Link__Assembler) AssignInt(int64) error { + return mixins.LinkAssembler{TypeName: "dagjose.Link"}.AssignInt(0) +} +func (_Link__Assembler) AssignFloat(float64) error { + return mixins.LinkAssembler{TypeName: "dagjose.Link"}.AssignFloat(0) +} +func (_Link__Assembler) AssignString(string) error { + return mixins.LinkAssembler{TypeName: "dagjose.Link"}.AssignString("") +} +func (_Link__Assembler) AssignBytes([]byte) error { + return mixins.LinkAssembler{TypeName: "dagjose.Link"}.AssignBytes(nil) +} +func (na *_Link__Assembler) AssignLink(v datamodel.Link) error { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + na.w.x = v + *na.m = schema.Maybe_Value + return nil +} +func (na *_Link__Assembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_Link); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v2, err := v.AsLink(); err != nil { + return err + } else { + return na.AssignLink(v2) + } +} +func (_Link__Assembler) Prototype() datamodel.NodePrototype { + return _Link__Prototype{} +} +func (Link) Type() schema.Type { + return nil /*TODO:typelit*/ +} +func (n Link) Representation() datamodel.Node { + return (*_Link__Repr)(n) +} + +type _Link__Repr = _Link + +var _ datamodel.Node = &_Link__Repr{} + +type _Link__ReprPrototype = _Link__Prototype +type _Link__ReprAssembler = _Link__Assembler + +func (n *_List) Lookup(idx int64) Any { + if n.Length() <= idx { + return nil + } + v := &n.x[idx] + return v +} +func (n *_List) LookupMaybe(idx int64) MaybeAny { + if n.Length() <= idx { + return nil + } + v := &n.x[idx] + return &_Any__Maybe{ + m: schema.Maybe_Value, + v: v, + } +} + +var _List__valueAbsent = _Any__Maybe{m: schema.Maybe_Absent} + +func (n List) Iterator() *List__Itr { + return &List__Itr{n, 0} +} + +type List__Itr struct { + n List + idx int +} + +func (itr *List__Itr) Next() (idx int64, v Any) { + if itr.idx >= len(itr.n.x) { + return -1, nil + } + idx = int64(itr.idx) + v = &itr.n.x[itr.idx] + itr.idx++ + return +} +func (itr *List__Itr) Done() bool { + return itr.idx >= len(itr.n.x) +} + +type _List__Maybe struct { + m schema.Maybe + v _List +} +type MaybeList = *_List__Maybe + +func (m MaybeList) IsNull() bool { + return m.m == schema.Maybe_Null +} +func (m MaybeList) IsAbsent() bool { + return m.m == schema.Maybe_Absent +} +func (m MaybeList) Exists() bool { + return m.m == schema.Maybe_Value +} +func (m MaybeList) AsNode() datamodel.Node { + switch m.m { + case schema.Maybe_Absent: + return datamodel.Absent + case schema.Maybe_Null: + return datamodel.Null + case schema.Maybe_Value: + return &m.v + default: + panic("unreachable") + } +} +func (m MaybeList) Must() List { + if !m.Exists() { + panic("unbox of a maybe rejected") + } + return &m.v +} + +var _ datamodel.Node = (List)(&_List{}) +var _ schema.TypedNode = (List)(&_List{}) + +func (List) Kind() datamodel.Kind { + return datamodel.Kind_List +} +func (List) LookupByString(string) (datamodel.Node, error) { + return mixins.List{TypeName: "dagjose.List"}.LookupByString("") +} +func (n List) LookupByNode(k datamodel.Node) (datamodel.Node, error) { + idx, err := k.AsInt() + if err != nil { + return nil, err + } + return n.LookupByIndex(idx) +} +func (n List) LookupByIndex(idx int64) (datamodel.Node, error) { + if n.Length() <= idx { + return nil, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfInt(idx)} + } + v := &n.x[idx] + return v, nil +} +func (n List) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + i, err := seg.Index() + if err != nil { + return nil, datamodel.ErrInvalidSegmentForList{TypeName: "dagjose.List", TroubleSegment: seg, Reason: err} + } + return n.LookupByIndex(i) +} +func (List) MapIterator() datamodel.MapIterator { + return nil +} +func (n List) ListIterator() datamodel.ListIterator { + return &_List__ListItr{n, 0} +} + +type _List__ListItr struct { + n List + idx int +} + +func (itr *_List__ListItr) Next() (idx int64, v datamodel.Node, _ error) { + if itr.idx >= len(itr.n.x) { + return -1, nil, datamodel.ErrIteratorOverread{} + } + idx = int64(itr.idx) + x := &itr.n.x[itr.idx] + v = x + itr.idx++ + return +} +func (itr *_List__ListItr) Done() bool { + return itr.idx >= len(itr.n.x) +} + +func (n List) Length() int64 { + return int64(len(n.x)) +} +func (List) IsAbsent() bool { + return false +} +func (List) IsNull() bool { + return false +} +func (List) AsBool() (bool, error) { + return mixins.List{TypeName: "dagjose.List"}.AsBool() +} +func (List) AsInt() (int64, error) { + return mixins.List{TypeName: "dagjose.List"}.AsInt() +} +func (List) AsFloat() (float64, error) { + return mixins.List{TypeName: "dagjose.List"}.AsFloat() +} +func (List) AsString() (string, error) { + return mixins.List{TypeName: "dagjose.List"}.AsString() +} +func (List) AsBytes() ([]byte, error) { + return mixins.List{TypeName: "dagjose.List"}.AsBytes() +} +func (List) AsLink() (datamodel.Link, error) { + return mixins.List{TypeName: "dagjose.List"}.AsLink() +} +func (List) Prototype() datamodel.NodePrototype { + return _List__Prototype{} +} + +type _List__Prototype struct{} + +func (_List__Prototype) NewBuilder() datamodel.NodeBuilder { + var nb _List__Builder + nb.Reset() + return &nb +} + +type _List__Builder struct { + _List__Assembler +} + +func (nb *_List__Builder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_List__Builder) Reset() { + var w _List + var m schema.Maybe + *nb = _List__Builder{_List__Assembler{w: &w, m: &m}} +} + +type _List__Assembler struct { + w *_List + m *schema.Maybe + state laState + + cm schema.Maybe + va _Any__Assembler +} + +func (na *_List__Assembler) reset() { + na.state = laState_initial + na.va.reset() +} +func (_List__Assembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.ListAssembler{TypeName: "dagjose.List"}.BeginMap(0) +} +func (na *_List__Assembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if sizeHint < 0 { + sizeHint = 0 + } + if sizeHint > 0 { + na.w.x = make([]_Any, 0, sizeHint) + } + return na, nil +} +func (na *_List__Assembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.ListAssembler{TypeName: "dagjose.List"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_List__Assembler) AssignBool(bool) error { + return mixins.ListAssembler{TypeName: "dagjose.List"}.AssignBool(false) +} +func (_List__Assembler) AssignInt(int64) error { + return mixins.ListAssembler{TypeName: "dagjose.List"}.AssignInt(0) +} +func (_List__Assembler) AssignFloat(float64) error { + return mixins.ListAssembler{TypeName: "dagjose.List"}.AssignFloat(0) +} +func (_List__Assembler) AssignString(string) error { + return mixins.ListAssembler{TypeName: "dagjose.List"}.AssignString("") +} +func (_List__Assembler) AssignBytes([]byte) error { + return mixins.ListAssembler{TypeName: "dagjose.List"}.AssignBytes(nil) +} +func (_List__Assembler) AssignLink(datamodel.Link) error { + return mixins.ListAssembler{TypeName: "dagjose.List"}.AssignLink(nil) +} +func (na *_List__Assembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_List); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_List { + return datamodel.ErrWrongKind{TypeName: "dagjose.List", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustList, ActualKind: v.Kind()} + } + itr := v.ListIterator() + for !itr.Done() { + _, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_List__Assembler) Prototype() datamodel.NodePrototype { + return _List__Prototype{} +} +func (la *_List__Assembler) valueFinishTidy() bool { + switch la.cm { + case schema.Maybe_Value: + la.va.w = nil + la.cm = schema.Maybe_Absent + la.state = laState_initial + la.va.reset() + return true + default: + return false + } +} +func (la *_List__Assembler) AssembleValue() datamodel.NodeAssembler { + switch la.state { + case laState_initial: + // carry on + case laState_midValue: + if !la.valueFinishTidy() { + panic("invalid state: AssembleValue cannot be called when still in the middle of assembling the previous value") + } // if tidy success: carry on + case laState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + la.w.x = append(la.w.x, _Any{}) + la.state = laState_midValue + row := &la.w.x[len(la.w.x)-1] + la.va.w = row + la.va.m = &la.cm + return &la.va +} +func (la *_List__Assembler) Finish() error { + switch la.state { + case laState_initial: + // carry on + case laState_midValue: + if !la.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case laState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + la.state = laState_finished + *la.m = schema.Maybe_Value + return nil +} +func (la *_List__Assembler) ValuePrototype(_ int64) datamodel.NodePrototype { + return _Any__Prototype{} +} +func (List) Type() schema.Type { + return nil /*TODO:typelit*/ +} +func (n List) Representation() datamodel.Node { + return (*_List__Repr)(n) +} + +type _List__Repr _List + +var _ datamodel.Node = &_List__Repr{} + +func (_List__Repr) Kind() datamodel.Kind { + return datamodel.Kind_List +} +func (_List__Repr) LookupByString(string) (datamodel.Node, error) { + return mixins.List{TypeName: "dagjose.List.Repr"}.LookupByString("") +} +func (nr *_List__Repr) LookupByNode(k datamodel.Node) (datamodel.Node, error) { + v, err := (List)(nr).LookupByNode(k) + if err != nil || v == datamodel.Null { + return v, err + } + return v.(Any).Representation(), nil +} +func (nr *_List__Repr) LookupByIndex(idx int64) (datamodel.Node, error) { + v, err := (List)(nr).LookupByIndex(idx) + if err != nil || v == datamodel.Null { + return v, err + } + return v.(Any).Representation(), nil +} +func (n _List__Repr) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + i, err := seg.Index() + if err != nil { + return nil, datamodel.ErrInvalidSegmentForList{TypeName: "dagjose.List.Repr", TroubleSegment: seg, Reason: err} + } + return n.LookupByIndex(i) +} +func (_List__Repr) MapIterator() datamodel.MapIterator { + return nil +} +func (nr *_List__Repr) ListIterator() datamodel.ListIterator { + return &_List__ReprListItr{(List)(nr), 0} +} + +type _List__ReprListItr _List__ListItr + +func (itr *_List__ReprListItr) Next() (idx int64, v datamodel.Node, err error) { + idx, v, err = (*_List__ListItr)(itr).Next() + if err != nil || v == datamodel.Null { + return + } + return idx, v.(Any).Representation(), nil +} +func (itr *_List__ReprListItr) Done() bool { + return (*_List__ListItr)(itr).Done() +} + +func (rn *_List__Repr) Length() int64 { + return int64(len(rn.x)) +} +func (_List__Repr) IsAbsent() bool { + return false +} +func (_List__Repr) IsNull() bool { + return false +} +func (_List__Repr) AsBool() (bool, error) { + return mixins.List{TypeName: "dagjose.List.Repr"}.AsBool() +} +func (_List__Repr) AsInt() (int64, error) { + return mixins.List{TypeName: "dagjose.List.Repr"}.AsInt() +} +func (_List__Repr) AsFloat() (float64, error) { + return mixins.List{TypeName: "dagjose.List.Repr"}.AsFloat() +} +func (_List__Repr) AsString() (string, error) { + return mixins.List{TypeName: "dagjose.List.Repr"}.AsString() +} +func (_List__Repr) AsBytes() ([]byte, error) { + return mixins.List{TypeName: "dagjose.List.Repr"}.AsBytes() +} +func (_List__Repr) AsLink() (datamodel.Link, error) { + return mixins.List{TypeName: "dagjose.List.Repr"}.AsLink() +} +func (_List__Repr) Prototype() datamodel.NodePrototype { + return _List__ReprPrototype{} +} + +type _List__ReprPrototype struct{} + +func (_List__ReprPrototype) NewBuilder() datamodel.NodeBuilder { + var nb _List__ReprBuilder + nb.Reset() + return &nb +} + +type _List__ReprBuilder struct { + _List__ReprAssembler +} + +func (nb *_List__ReprBuilder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_List__ReprBuilder) Reset() { + var w _List + var m schema.Maybe + *nb = _List__ReprBuilder{_List__ReprAssembler{w: &w, m: &m}} +} + +type _List__ReprAssembler struct { + w *_List + m *schema.Maybe + state laState + + cm schema.Maybe + va _Any__ReprAssembler +} + +func (na *_List__ReprAssembler) reset() { + na.state = laState_initial + na.va.reset() +} +func (_List__ReprAssembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.ListAssembler{TypeName: "dagjose.List.Repr"}.BeginMap(0) +} +func (na *_List__ReprAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if sizeHint < 0 { + sizeHint = 0 + } + if sizeHint > 0 { + na.w.x = make([]_Any, 0, sizeHint) + } + return na, nil +} +func (na *_List__ReprAssembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.ListAssembler{TypeName: "dagjose.List.Repr.Repr"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_List__ReprAssembler) AssignBool(bool) error { + return mixins.ListAssembler{TypeName: "dagjose.List.Repr"}.AssignBool(false) +} +func (_List__ReprAssembler) AssignInt(int64) error { + return mixins.ListAssembler{TypeName: "dagjose.List.Repr"}.AssignInt(0) +} +func (_List__ReprAssembler) AssignFloat(float64) error { + return mixins.ListAssembler{TypeName: "dagjose.List.Repr"}.AssignFloat(0) +} +func (_List__ReprAssembler) AssignString(string) error { + return mixins.ListAssembler{TypeName: "dagjose.List.Repr"}.AssignString("") +} +func (_List__ReprAssembler) AssignBytes([]byte) error { + return mixins.ListAssembler{TypeName: "dagjose.List.Repr"}.AssignBytes(nil) +} +func (_List__ReprAssembler) AssignLink(datamodel.Link) error { + return mixins.ListAssembler{TypeName: "dagjose.List.Repr"}.AssignLink(nil) +} +func (na *_List__ReprAssembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_List); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_List { + return datamodel.ErrWrongKind{TypeName: "dagjose.List.Repr", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustList, ActualKind: v.Kind()} + } + itr := v.ListIterator() + for !itr.Done() { + _, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_List__ReprAssembler) Prototype() datamodel.NodePrototype { + return _List__ReprPrototype{} +} +func (la *_List__ReprAssembler) valueFinishTidy() bool { + switch la.cm { + case schema.Maybe_Value: + la.va.w = nil + la.cm = schema.Maybe_Absent + la.state = laState_initial + la.va.reset() + return true + default: + return false + } +} +func (la *_List__ReprAssembler) AssembleValue() datamodel.NodeAssembler { + switch la.state { + case laState_initial: + // carry on + case laState_midValue: + if !la.valueFinishTidy() { + panic("invalid state: AssembleValue cannot be called when still in the middle of assembling the previous value") + } // if tidy success: carry on + case laState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + la.w.x = append(la.w.x, _Any{}) + la.state = laState_midValue + row := &la.w.x[len(la.w.x)-1] + la.va.w = row + la.va.m = &la.cm + return &la.va +} +func (la *_List__ReprAssembler) Finish() error { + switch la.state { + case laState_initial: + // carry on + case laState_midValue: + if !la.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case laState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + la.state = laState_finished + *la.m = schema.Maybe_Value + return nil +} +func (la *_List__ReprAssembler) ValuePrototype(_ int64) datamodel.NodePrototype { + return _Any__ReprPrototype{} +} + +func (n *_Map) Lookup(k String) Any { + v, exists := n.m[*k] + if !exists { + return nil + } + return v +} +func (n *_Map) LookupMaybe(k String) MaybeAny { + v, exists := n.m[*k] + if !exists { + return &_Map__valueAbsent + } + return &_Any__Maybe{ + m: schema.Maybe_Value, + v: v, + } +} + +var _Map__valueAbsent = _Any__Maybe{m: schema.Maybe_Absent} + +func (n Map) Iterator() *Map__Itr { + return &Map__Itr{n, 0} +} + +type Map__Itr struct { + n Map + idx int +} + +func (itr *Map__Itr) Next() (k String, v Any) { + if itr.idx >= len(itr.n.t) { + return nil, nil + } + x := &itr.n.t[itr.idx] + k = &x.k + v = &x.v + itr.idx++ + return +} +func (itr *Map__Itr) Done() bool { + return itr.idx >= len(itr.n.t) +} + +type _Map__Maybe struct { + m schema.Maybe + v _Map +} +type MaybeMap = *_Map__Maybe + +func (m MaybeMap) IsNull() bool { + return m.m == schema.Maybe_Null +} +func (m MaybeMap) IsAbsent() bool { + return m.m == schema.Maybe_Absent +} +func (m MaybeMap) Exists() bool { + return m.m == schema.Maybe_Value +} +func (m MaybeMap) AsNode() datamodel.Node { + switch m.m { + case schema.Maybe_Absent: + return datamodel.Absent + case schema.Maybe_Null: + return datamodel.Null + case schema.Maybe_Value: + return &m.v + default: + panic("unreachable") + } +} +func (m MaybeMap) Must() Map { + if !m.Exists() { + panic("unbox of a maybe rejected") + } + return &m.v +} + +var _ datamodel.Node = (Map)(&_Map{}) +var _ schema.TypedNode = (Map)(&_Map{}) + +func (Map) Kind() datamodel.Kind { + return datamodel.Kind_Map +} +func (n Map) LookupByString(k string) (datamodel.Node, error) { + var k2 _String + if err := (_String__ReprPrototype{}).fromString(&k2, k); err != nil { + return nil, err // TODO wrap in some kind of ErrInvalidKey + } + v, exists := n.m[k2] + if !exists { + return nil, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(k)} + } + return v, nil +} +func (n Map) LookupByNode(k datamodel.Node) (datamodel.Node, error) { + k2, ok := k.(String) + if !ok { + panic("todo invalid key type error") + // 'schema.ErrInvalidKey{TypeName:"dagjose.Map", Key:&_String{k}}' doesn't quite cut it: need room to explain the type, and it's not guaranteed k can be turned into a string at all + } + v, exists := n.m[*k2] + if !exists { + return nil, datamodel.ErrNotExists{Segment: datamodel.PathSegmentOfString(k2.String())} + } + return v, nil +} +func (Map) LookupByIndex(idx int64) (datamodel.Node, error) { + return mixins.Map{TypeName: "dagjose.Map"}.LookupByIndex(0) +} +func (n Map) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + return n.LookupByString(seg.String()) +} +func (n Map) MapIterator() datamodel.MapIterator { + return &_Map__MapItr{n, 0} +} + +type _Map__MapItr struct { + n Map + idx int +} + +func (itr *_Map__MapItr) Next() (k datamodel.Node, v datamodel.Node, _ error) { + if itr.idx >= len(itr.n.t) { + return nil, nil, datamodel.ErrIteratorOverread{} + } + x := &itr.n.t[itr.idx] + k = &x.k + v = &x.v + itr.idx++ + return +} +func (itr *_Map__MapItr) Done() bool { + return itr.idx >= len(itr.n.t) +} + +func (Map) ListIterator() datamodel.ListIterator { + return nil +} +func (n Map) Length() int64 { + return int64(len(n.t)) +} +func (Map) IsAbsent() bool { + return false +} +func (Map) IsNull() bool { + return false +} +func (Map) AsBool() (bool, error) { + return mixins.Map{TypeName: "dagjose.Map"}.AsBool() +} +func (Map) AsInt() (int64, error) { + return mixins.Map{TypeName: "dagjose.Map"}.AsInt() +} +func (Map) AsFloat() (float64, error) { + return mixins.Map{TypeName: "dagjose.Map"}.AsFloat() +} +func (Map) AsString() (string, error) { + return mixins.Map{TypeName: "dagjose.Map"}.AsString() +} +func (Map) AsBytes() ([]byte, error) { + return mixins.Map{TypeName: "dagjose.Map"}.AsBytes() +} +func (Map) AsLink() (datamodel.Link, error) { + return mixins.Map{TypeName: "dagjose.Map"}.AsLink() +} +func (Map) Prototype() datamodel.NodePrototype { + return _Map__Prototype{} +} + +type _Map__Prototype struct{} + +func (_Map__Prototype) NewBuilder() datamodel.NodeBuilder { + var nb _Map__Builder + nb.Reset() + return &nb +} + +type _Map__Builder struct { + _Map__Assembler +} + +func (nb *_Map__Builder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_Map__Builder) Reset() { + var w _Map + var m schema.Maybe + *nb = _Map__Builder{_Map__Assembler{w: &w, m: &m}} +} + +type _Map__Assembler struct { + w *_Map + m *schema.Maybe + state maState + + cm schema.Maybe + ka _String__Assembler + va _Any__Assembler +} + +func (na *_Map__Assembler) reset() { + na.state = maState_initial + na.ka.reset() + na.va.reset() +} +func (na *_Map__Assembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if sizeHint < 0 { + sizeHint = 0 + } + na.w.m = make(map[_String]*_Any, sizeHint) + na.w.t = make([]_Map__entry, 0, sizeHint) + return na, nil +} +func (_Map__Assembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.MapAssembler{TypeName: "dagjose.Map"}.BeginList(0) +} +func (na *_Map__Assembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.MapAssembler{TypeName: "dagjose.Map"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_Map__Assembler) AssignBool(bool) error { + return mixins.MapAssembler{TypeName: "dagjose.Map"}.AssignBool(false) +} +func (_Map__Assembler) AssignInt(int64) error { + return mixins.MapAssembler{TypeName: "dagjose.Map"}.AssignInt(0) +} +func (_Map__Assembler) AssignFloat(float64) error { + return mixins.MapAssembler{TypeName: "dagjose.Map"}.AssignFloat(0) +} +func (_Map__Assembler) AssignString(string) error { + return mixins.MapAssembler{TypeName: "dagjose.Map"}.AssignString("") +} +func (_Map__Assembler) AssignBytes([]byte) error { + return mixins.MapAssembler{TypeName: "dagjose.Map"}.AssignBytes(nil) +} +func (_Map__Assembler) AssignLink(datamodel.Link) error { + return mixins.MapAssembler{TypeName: "dagjose.Map"}.AssignLink(nil) +} +func (na *_Map__Assembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_Map); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_Map { + return datamodel.ErrWrongKind{TypeName: "dagjose.Map", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustMap, ActualKind: v.Kind()} + } + itr := v.MapIterator() + for !itr.Done() { + k, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleKey().AssignNode(k); err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_Map__Assembler) Prototype() datamodel.NodePrototype { + return _Map__Prototype{} +} +func (ma *_Map__Assembler) keyFinishTidy() bool { + switch ma.cm { + case schema.Maybe_Value: + ma.ka.w = nil + tz := &ma.w.t[len(ma.w.t)-1] + ma.cm = schema.Maybe_Absent + ma.state = maState_expectValue + ma.w.m[tz.k] = &tz.v + ma.va.w = &tz.v + ma.va.m = &ma.cm + ma.ka.reset() + return true + default: + return false + } +} +func (ma *_Map__Assembler) valueFinishTidy() bool { + switch ma.cm { + case schema.Maybe_Value: + ma.va.w = nil + ma.cm = schema.Maybe_Absent + ma.state = maState_initial + ma.va.reset() + return true + default: + return false + } +} +func (ma *_Map__Assembler) AssembleEntry(k string) (datamodel.NodeAssembler, error) { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleEntry cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleEntry cannot be called on an assembler that's already finished") + } + + var k2 _String + if err := (_String__ReprPrototype{}).fromString(&k2, k); err != nil { + return nil, err // TODO wrap in some kind of ErrInvalidKey + } + if _, exists := ma.w.m[k2]; exists { + return nil, datamodel.ErrRepeatedMapKey{Key: &k2} + } + ma.w.t = append(ma.w.t, _Map__entry{k: k2}) + tz := &ma.w.t[len(ma.w.t)-1] + ma.state = maState_midValue + + ma.w.m[k2] = &tz.v + ma.va.w = &tz.v + ma.va.m = &ma.cm + return &ma.va, nil +} +func (ma *_Map__Assembler) AssembleKey() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleKey cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleKey cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleKey cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleKey cannot be called on an assembler that's already finished") + } + ma.w.t = append(ma.w.t, _Map__entry{}) + ma.state = maState_midKey + ma.ka.m = &ma.cm + ma.ka.w = &ma.w.t[len(ma.w.t)-1].k + return &ma.ka +} +func (ma *_Map__Assembler) AssembleValue() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + panic("invalid state: AssembleValue cannot be called when no key is primed") + case maState_midKey: + if !ma.keyFinishTidy() { + panic("invalid state: AssembleValue cannot be called when in the middle of assembling a key") + } // if tidy success: carry on + case maState_expectValue: + // carry on + case maState_midValue: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling another value") + case maState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + ma.state = maState_midValue + return &ma.va +} +func (ma *_Map__Assembler) Finish() error { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: Finish cannot be called when in the middle of assembling a key") + case maState_expectValue: + panic("invalid state: Finish cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + ma.state = maState_finished + *ma.m = schema.Maybe_Value + return nil +} +func (ma *_Map__Assembler) KeyPrototype() datamodel.NodePrototype { + return _String__Prototype{} +} +func (ma *_Map__Assembler) ValuePrototype(_ string) datamodel.NodePrototype { + return _Any__Prototype{} +} +func (Map) Type() schema.Type { + return nil /*TODO:typelit*/ +} +func (n Map) Representation() datamodel.Node { + return (*_Map__Repr)(n) +} + +type _Map__Repr _Map + +var _ datamodel.Node = &_Map__Repr{} + +func (_Map__Repr) Kind() datamodel.Kind { + return datamodel.Kind_Map +} +func (nr *_Map__Repr) LookupByString(k string) (datamodel.Node, error) { + v, err := (Map)(nr).LookupByString(k) + if err != nil || v == datamodel.Null { + return v, err + } + return v.(Any).Representation(), nil +} +func (nr *_Map__Repr) LookupByNode(k datamodel.Node) (datamodel.Node, error) { + v, err := (Map)(nr).LookupByNode(k) + if err != nil || v == datamodel.Null { + return v, err + } + return v.(Any).Representation(), nil +} +func (_Map__Repr) LookupByIndex(idx int64) (datamodel.Node, error) { + return mixins.Map{TypeName: "dagjose.Map.Repr"}.LookupByIndex(0) +} +func (n _Map__Repr) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + return n.LookupByString(seg.String()) +} +func (nr *_Map__Repr) MapIterator() datamodel.MapIterator { + return &_Map__ReprMapItr{(Map)(nr), 0} +} + +type _Map__ReprMapItr _Map__MapItr + +func (itr *_Map__ReprMapItr) Next() (k datamodel.Node, v datamodel.Node, err error) { + k, v, err = (*_Map__MapItr)(itr).Next() + if err != nil || v == datamodel.Null { + return + } + return k, v.(Any).Representation(), nil +} +func (itr *_Map__ReprMapItr) Done() bool { + return (*_Map__MapItr)(itr).Done() +} + +func (_Map__Repr) ListIterator() datamodel.ListIterator { + return nil +} +func (rn *_Map__Repr) Length() int64 { + return int64(len(rn.t)) +} +func (_Map__Repr) IsAbsent() bool { + return false +} +func (_Map__Repr) IsNull() bool { + return false +} +func (_Map__Repr) AsBool() (bool, error) { + return mixins.Map{TypeName: "dagjose.Map.Repr"}.AsBool() +} +func (_Map__Repr) AsInt() (int64, error) { + return mixins.Map{TypeName: "dagjose.Map.Repr"}.AsInt() +} +func (_Map__Repr) AsFloat() (float64, error) { + return mixins.Map{TypeName: "dagjose.Map.Repr"}.AsFloat() +} +func (_Map__Repr) AsString() (string, error) { + return mixins.Map{TypeName: "dagjose.Map.Repr"}.AsString() +} +func (_Map__Repr) AsBytes() ([]byte, error) { + return mixins.Map{TypeName: "dagjose.Map.Repr"}.AsBytes() +} +func (_Map__Repr) AsLink() (datamodel.Link, error) { + return mixins.Map{TypeName: "dagjose.Map.Repr"}.AsLink() +} +func (_Map__Repr) Prototype() datamodel.NodePrototype { + return _Map__ReprPrototype{} +} + +type _Map__ReprPrototype struct{} + +func (_Map__ReprPrototype) NewBuilder() datamodel.NodeBuilder { + var nb _Map__ReprBuilder + nb.Reset() + return &nb +} + +type _Map__ReprBuilder struct { + _Map__ReprAssembler +} + +func (nb *_Map__ReprBuilder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_Map__ReprBuilder) Reset() { + var w _Map + var m schema.Maybe + *nb = _Map__ReprBuilder{_Map__ReprAssembler{w: &w, m: &m}} +} + +type _Map__ReprAssembler struct { + w *_Map + m *schema.Maybe + state maState + + cm schema.Maybe + ka _String__ReprAssembler + va _Any__ReprAssembler +} + +func (na *_Map__ReprAssembler) reset() { + na.state = maState_initial + na.ka.reset() + na.va.reset() +} +func (na *_Map__ReprAssembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: it makes no sense to 'begin' twice on the same assembler!") + } + *na.m = midvalue + if sizeHint < 0 { + sizeHint = 0 + } + na.w.m = make(map[_String]*_Any, sizeHint) + na.w.t = make([]_Map__entry, 0, sizeHint) + return na, nil +} +func (_Map__ReprAssembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.MapAssembler{TypeName: "dagjose.Map.Repr"}.BeginList(0) +} +func (na *_Map__ReprAssembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.MapAssembler{TypeName: "dagjose.Map.Repr.Repr"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + panic("unreachable") +} +func (_Map__ReprAssembler) AssignBool(bool) error { + return mixins.MapAssembler{TypeName: "dagjose.Map.Repr"}.AssignBool(false) +} +func (_Map__ReprAssembler) AssignInt(int64) error { + return mixins.MapAssembler{TypeName: "dagjose.Map.Repr"}.AssignInt(0) +} +func (_Map__ReprAssembler) AssignFloat(float64) error { + return mixins.MapAssembler{TypeName: "dagjose.Map.Repr"}.AssignFloat(0) +} +func (_Map__ReprAssembler) AssignString(string) error { + return mixins.MapAssembler{TypeName: "dagjose.Map.Repr"}.AssignString("") +} +func (_Map__ReprAssembler) AssignBytes([]byte) error { + return mixins.MapAssembler{TypeName: "dagjose.Map.Repr"}.AssignBytes(nil) +} +func (_Map__ReprAssembler) AssignLink(datamodel.Link) error { + return mixins.MapAssembler{TypeName: "dagjose.Map.Repr"}.AssignLink(nil) +} +func (na *_Map__ReprAssembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_Map); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + case midvalue: + panic("invalid state: cannot assign null into an assembler that's already begun working on recursive structures!") + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v.Kind() != datamodel.Kind_Map { + return datamodel.ErrWrongKind{TypeName: "dagjose.Map.Repr", MethodName: "AssignNode", AppropriateKind: datamodel.KindSet_JustMap, ActualKind: v.Kind()} + } + itr := v.MapIterator() + for !itr.Done() { + k, v, err := itr.Next() + if err != nil { + return err + } + if err := na.AssembleKey().AssignNode(k); err != nil { + return err + } + if err := na.AssembleValue().AssignNode(v); err != nil { + return err + } + } + return na.Finish() +} +func (_Map__ReprAssembler) Prototype() datamodel.NodePrototype { + return _Map__ReprPrototype{} +} +func (ma *_Map__ReprAssembler) keyFinishTidy() bool { + switch ma.cm { + case schema.Maybe_Value: + ma.ka.w = nil + tz := &ma.w.t[len(ma.w.t)-1] + ma.cm = schema.Maybe_Absent + ma.state = maState_expectValue + ma.w.m[tz.k] = &tz.v + ma.va.w = &tz.v + ma.va.m = &ma.cm + ma.ka.reset() + return true + default: + return false + } +} +func (ma *_Map__ReprAssembler) valueFinishTidy() bool { + switch ma.cm { + case schema.Maybe_Value: + ma.va.w = nil + ma.cm = schema.Maybe_Absent + ma.state = maState_initial + ma.va.reset() + return true + default: + return false + } +} +func (ma *_Map__ReprAssembler) AssembleEntry(k string) (datamodel.NodeAssembler, error) { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleEntry cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleEntry cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleEntry cannot be called on an assembler that's already finished") + } + + var k2 _String + if err := (_String__ReprPrototype{}).fromString(&k2, k); err != nil { + return nil, err // TODO wrap in some kind of ErrInvalidKey + } + if _, exists := ma.w.m[k2]; exists { + return nil, datamodel.ErrRepeatedMapKey{Key: &k2} + } + ma.w.t = append(ma.w.t, _Map__entry{k: k2}) + tz := &ma.w.t[len(ma.w.t)-1] + ma.state = maState_midValue + + ma.w.m[k2] = &tz.v + ma.va.w = &tz.v + ma.va.m = &ma.cm + return &ma.va, nil +} +func (ma *_Map__ReprAssembler) AssembleKey() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: AssembleKey cannot be called when in the middle of assembling another key") + case maState_expectValue: + panic("invalid state: AssembleKey cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: AssembleKey cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: AssembleKey cannot be called on an assembler that's already finished") + } + ma.w.t = append(ma.w.t, _Map__entry{}) + ma.state = maState_midKey + ma.ka.m = &ma.cm + ma.ka.w = &ma.w.t[len(ma.w.t)-1].k + return &ma.ka +} +func (ma *_Map__ReprAssembler) AssembleValue() datamodel.NodeAssembler { + switch ma.state { + case maState_initial: + panic("invalid state: AssembleValue cannot be called when no key is primed") + case maState_midKey: + if !ma.keyFinishTidy() { + panic("invalid state: AssembleValue cannot be called when in the middle of assembling a key") + } // if tidy success: carry on + case maState_expectValue: + // carry on + case maState_midValue: + panic("invalid state: AssembleValue cannot be called when in the middle of assembling another value") + case maState_finished: + panic("invalid state: AssembleValue cannot be called on an assembler that's already finished") + } + ma.state = maState_midValue + return &ma.va +} +func (ma *_Map__ReprAssembler) Finish() error { + switch ma.state { + case maState_initial: + // carry on + case maState_midKey: + panic("invalid state: Finish cannot be called when in the middle of assembling a key") + case maState_expectValue: + panic("invalid state: Finish cannot be called when expecting start of value assembly") + case maState_midValue: + if !ma.valueFinishTidy() { + panic("invalid state: Finish cannot be called when in the middle of assembling a value") + } // if tidy success: carry on + case maState_finished: + panic("invalid state: Finish cannot be called on an assembler that's already finished") + } + ma.state = maState_finished + *ma.m = schema.Maybe_Value + return nil +} +func (ma *_Map__ReprAssembler) KeyPrototype() datamodel.NodePrototype { + return _String__ReprPrototype{} +} +func (ma *_Map__ReprAssembler) ValuePrototype(_ string) datamodel.NodePrototype { + return _Any__ReprPrototype{} +} + +func (n String) String() string { + return n.x +} +func (_String__Prototype) fromString(w *_String, v string) error { + *w = _String{v} + return nil +} +func (_String__Prototype) FromString(v string) (String, error) { + n := _String{v} + return &n, nil +} + +type _String__Maybe struct { + m schema.Maybe + v _String +} +type MaybeString = *_String__Maybe + +func (m MaybeString) IsNull() bool { + return m.m == schema.Maybe_Null +} +func (m MaybeString) IsAbsent() bool { + return m.m == schema.Maybe_Absent +} +func (m MaybeString) Exists() bool { + return m.m == schema.Maybe_Value +} +func (m MaybeString) AsNode() datamodel.Node { + switch m.m { + case schema.Maybe_Absent: + return datamodel.Absent + case schema.Maybe_Null: + return datamodel.Null + case schema.Maybe_Value: + return &m.v + default: + panic("unreachable") + } +} +func (m MaybeString) Must() String { + if !m.Exists() { + panic("unbox of a maybe rejected") + } + return &m.v +} + +var _ datamodel.Node = (String)(&_String{}) +var _ schema.TypedNode = (String)(&_String{}) + +func (String) Kind() datamodel.Kind { + return datamodel.Kind_String +} +func (String) LookupByString(string) (datamodel.Node, error) { + return mixins.String{TypeName: "dagjose.String"}.LookupByString("") +} +func (String) LookupByNode(datamodel.Node) (datamodel.Node, error) { + return mixins.String{TypeName: "dagjose.String"}.LookupByNode(nil) +} +func (String) LookupByIndex(idx int64) (datamodel.Node, error) { + return mixins.String{TypeName: "dagjose.String"}.LookupByIndex(0) +} +func (String) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + return mixins.String{TypeName: "dagjose.String"}.LookupBySegment(seg) +} +func (String) MapIterator() datamodel.MapIterator { + return nil +} +func (String) ListIterator() datamodel.ListIterator { + return nil +} +func (String) Length() int64 { + return -1 +} +func (String) IsAbsent() bool { + return false +} +func (String) IsNull() bool { + return false +} +func (String) AsBool() (bool, error) { + return mixins.String{TypeName: "dagjose.String"}.AsBool() +} +func (String) AsInt() (int64, error) { + return mixins.String{TypeName: "dagjose.String"}.AsInt() +} +func (String) AsFloat() (float64, error) { + return mixins.String{TypeName: "dagjose.String"}.AsFloat() +} +func (n String) AsString() (string, error) { + return n.x, nil +} +func (String) AsBytes() ([]byte, error) { + return mixins.String{TypeName: "dagjose.String"}.AsBytes() +} +func (String) AsLink() (datamodel.Link, error) { + return mixins.String{TypeName: "dagjose.String"}.AsLink() +} +func (String) Prototype() datamodel.NodePrototype { + return _String__Prototype{} +} + +type _String__Prototype struct{} + +func (_String__Prototype) NewBuilder() datamodel.NodeBuilder { + var nb _String__Builder + nb.Reset() + return &nb +} + +type _String__Builder struct { + _String__Assembler +} + +func (nb *_String__Builder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_String__Builder) Reset() { + var w _String + var m schema.Maybe + *nb = _String__Builder{_String__Assembler{w: &w, m: &m}} +} + +type _String__Assembler struct { + w *_String + m *schema.Maybe +} + +func (na *_String__Assembler) reset() {} +func (_String__Assembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.String"}.BeginMap(0) +} +func (_String__Assembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.String"}.BeginList(0) +} +func (na *_String__Assembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.StringAssembler{TypeName: "dagjose.String"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + panic("unreachable") +} +func (_String__Assembler) AssignBool(bool) error { + return mixins.StringAssembler{TypeName: "dagjose.String"}.AssignBool(false) +} +func (_String__Assembler) AssignInt(int64) error { + return mixins.StringAssembler{TypeName: "dagjose.String"}.AssignInt(0) +} +func (_String__Assembler) AssignFloat(float64) error { + return mixins.StringAssembler{TypeName: "dagjose.String"}.AssignFloat(0) +} +func (na *_String__Assembler) AssignString(v string) error { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + na.w.x = v + *na.m = schema.Maybe_Value + return nil +} +func (_String__Assembler) AssignBytes([]byte) error { + return mixins.StringAssembler{TypeName: "dagjose.String"}.AssignBytes(nil) +} +func (_String__Assembler) AssignLink(datamodel.Link) error { + return mixins.StringAssembler{TypeName: "dagjose.String"}.AssignLink(nil) +} +func (na *_String__Assembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_String); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v2, err := v.AsString(); err != nil { + return err + } else { + return na.AssignString(v2) + } +} +func (_String__Assembler) Prototype() datamodel.NodePrototype { + return _String__Prototype{} +} +func (String) Type() schema.Type { + return nil /*TODO:typelit*/ +} +func (n String) Representation() datamodel.Node { + return (*_String__Repr)(n) +} + +type _String__Repr = _String + +var _ datamodel.Node = &_String__Repr{} + +type _String__ReprPrototype = _String__Prototype +type _String__ReprAssembler = _String__Assembler diff --git a/dagjose/ipldsch_types.go b/dagjose/ipldsch_types.go new file mode 100644 index 0000000..c3c1a58 --- /dev/null +++ b/dagjose/ipldsch_types.go @@ -0,0 +1,211 @@ +package dagjose + +// Code generated by go-ipld-prime gengo. DO NOT EDIT. + +import ( + "github.com/ipld/go-ipld-prime/datamodel" +) + +var _ datamodel.Node = nil // suppress errors when this dependency is not referenced +// Type is a struct embeding a NodePrototype/Type for every Node implementation in this package. +// One of its major uses is to start the construction of a value. +// You can use it like this: +// +// dagjose.Type.YourTypeName.NewBuilder().BeginMap() //... +// +// and: +// +// dagjose.Type.OtherTypeName.NewBuilder().AssignString("x") // ... +// +var Type typeSlab + +type typeSlab struct { + Any _Any__Prototype + Any__Repr _Any__ReprPrototype + Base64Url _Base64Url__Prototype + Base64Url__Repr _Base64Url__ReprPrototype + Bytes _Bytes__Prototype + Bytes__Repr _Bytes__ReprPrototype + DecodedJOSE _DecodedJOSE__Prototype + DecodedJOSE__Repr _DecodedJOSE__ReprPrototype + DecodedRecipient _DecodedRecipient__Prototype + DecodedRecipient__Repr _DecodedRecipient__ReprPrototype + DecodedRecipients _DecodedRecipients__Prototype + DecodedRecipients__Repr _DecodedRecipients__ReprPrototype + DecodedSignature _DecodedSignature__Prototype + DecodedSignature__Repr _DecodedSignature__ReprPrototype + DecodedSignatures _DecodedSignatures__Prototype + DecodedSignatures__Repr _DecodedSignatures__ReprPrototype + EncodedJOSE _EncodedJOSE__Prototype + EncodedJOSE__Repr _EncodedJOSE__ReprPrototype + EncodedRecipient _EncodedRecipient__Prototype + EncodedRecipient__Repr _EncodedRecipient__ReprPrototype + EncodedRecipients _EncodedRecipients__Prototype + EncodedRecipients__Repr _EncodedRecipients__ReprPrototype + EncodedSignature _EncodedSignature__Prototype + EncodedSignature__Repr _EncodedSignature__ReprPrototype + EncodedSignatures _EncodedSignatures__Prototype + EncodedSignatures__Repr _EncodedSignatures__ReprPrototype + Float _Float__Prototype + Float__Repr _Float__ReprPrototype + Int _Int__Prototype + Int__Repr _Int__ReprPrototype + Link _Link__Prototype + Link__Repr _Link__ReprPrototype + List _List__Prototype + List__Repr _List__ReprPrototype + Map _Map__Prototype + Map__Repr _Map__ReprPrototype + Raw _Raw__Prototype + Raw__Repr _Raw__ReprPrototype + String _String__Prototype + String__Repr _String__ReprPrototype +} + +// --- type definitions follow --- + +// Any matches the IPLD Schema type "Any". +// Any has union typekind, which means its data model behaviors are that of a map kind. +type Any = *_Any +type _Any struct { + x _Any__iface +} +type _Any__iface interface { + _Any__member() +} + +func (_String) _Any__member() {} +func (_Bytes) _Any__member() {} +func (_Int) _Any__member() {} +func (_Float) _Any__member() {} +func (_Map) _Any__member() {} +func (_List) _Any__member() {} + +// Base64Url matches the IPLD Schema type "Base64Url". It has string kind. +type Base64Url = *_Base64Url +type _Base64Url struct{ x string } + +// Bytes matches the IPLD Schema type "Bytes". It has bytes kind. +type Bytes = *_Bytes +type _Bytes struct{ x []byte } + +// DecodedJOSE matches the IPLD Schema type "DecodedJOSE". It has struct type-kind, and may be interrogated like map kind. +type DecodedJOSE = *_DecodedJOSE +type _DecodedJOSE struct { + aad _Base64Url__Maybe + ciphertext _Base64Url__Maybe + iv _Base64Url__Maybe + link _Link__Maybe + payload _Base64Url__Maybe + protected _Base64Url__Maybe + recipients _DecodedRecipients__Maybe + signatures _DecodedSignatures__Maybe + tag _Base64Url__Maybe + unprotected _Any__Maybe +} + +// DecodedRecipient matches the IPLD Schema type "DecodedRecipient". It has struct type-kind, and may be interrogated like map kind. +type DecodedRecipient = *_DecodedRecipient +type _DecodedRecipient struct { + header _Any__Maybe + encrypted_key _Base64Url__Maybe +} + +// DecodedRecipients matches the IPLD Schema type "DecodedRecipients". It has list kind. +type DecodedRecipients = *_DecodedRecipients +type _DecodedRecipients struct { + x []_DecodedRecipient +} + +// DecodedSignature matches the IPLD Schema type "DecodedSignature". It has struct type-kind, and may be interrogated like map kind. +type DecodedSignature = *_DecodedSignature +type _DecodedSignature struct { + header _Any__Maybe + protected _Base64Url__Maybe + signature _Base64Url +} + +// DecodedSignatures matches the IPLD Schema type "DecodedSignatures". It has list kind. +type DecodedSignatures = *_DecodedSignatures +type _DecodedSignatures struct { + x []_DecodedSignature +} + +// EncodedJOSE matches the IPLD Schema type "EncodedJOSE". It has struct type-kind, and may be interrogated like map kind. +type EncodedJOSE = *_EncodedJOSE +type _EncodedJOSE struct { + aad _Raw__Maybe + ciphertext _Raw__Maybe + iv _Raw__Maybe + link _Link__Maybe + payload _Raw__Maybe + protected _Raw__Maybe + recipients _EncodedRecipients__Maybe + signatures _EncodedSignatures__Maybe + tag _Raw__Maybe + unprotected _Any__Maybe +} + +// EncodedRecipient matches the IPLD Schema type "EncodedRecipient". It has struct type-kind, and may be interrogated like map kind. +type EncodedRecipient = *_EncodedRecipient +type _EncodedRecipient struct { + header _Any__Maybe + encrypted_key _Raw__Maybe +} + +// EncodedRecipients matches the IPLD Schema type "EncodedRecipients". It has list kind. +type EncodedRecipients = *_EncodedRecipients +type _EncodedRecipients struct { + x []_EncodedRecipient +} + +// EncodedSignature matches the IPLD Schema type "EncodedSignature". It has struct type-kind, and may be interrogated like map kind. +type EncodedSignature = *_EncodedSignature +type _EncodedSignature struct { + header _Any__Maybe + protected _Raw__Maybe + signature _Raw +} + +// EncodedSignatures matches the IPLD Schema type "EncodedSignatures". It has list kind. +type EncodedSignatures = *_EncodedSignatures +type _EncodedSignatures struct { + x []_EncodedSignature +} + +// Float matches the IPLD Schema type "Float". It has float kind. +type Float = *_Float +type _Float struct{ x float64 } + +// Int matches the IPLD Schema type "Int". It has int kind. +type Int = *_Int +type _Int struct{ x int64 } + +// Link matches the IPLD Schema type "Link". It has link kind. +type Link = *_Link +type _Link struct{ x datamodel.Link } + +// List matches the IPLD Schema type "List". It has list kind. +type List = *_List +type _List struct { + x []_Any +} + +// Map matches the IPLD Schema type "Map". It has map kind. +type Map = *_Map +type _Map struct { + m map[_String]*_Any + t []_Map__entry +} +type _Map__entry struct { + k _String + v _Any +} + +// Raw matches the IPLD Schema type "Raw". It has bytes kind. +type Raw = *_Raw +type _Raw struct{ x []byte } + +// String matches the IPLD Schema type "String". It has string kind. +type String = *_String +type _String struct{ x string } diff --git a/dagjose/jose_bytes.go b/dagjose/jose_bytes.go new file mode 100644 index 0000000..b74c144 --- /dev/null +++ b/dagjose/jose_bytes.go @@ -0,0 +1,456 @@ +package dagjose + +import ( + "encoding/base64" + + "github.com/ipfs/go-cid" + "github.com/ipld/go-ipld-prime/datamodel" + "github.com/ipld/go-ipld-prime/linking/cid" + "github.com/ipld/go-ipld-prime/node/mixins" + "github.com/ipld/go-ipld-prime/schema" +) + +type _Base64Url__Maybe struct { + m schema.Maybe + v _Base64Url +} +type MaybeBase64Url = *_Base64Url__Maybe + +func (m MaybeBase64Url) IsNull() bool { + return m.m == schema.Maybe_Null +} +func (m MaybeBase64Url) IsAbsent() bool { + return m.m == schema.Maybe_Absent +} +func (m MaybeBase64Url) Exists() bool { + return m.m == schema.Maybe_Value +} +func (m MaybeBase64Url) AsNode() datamodel.Node { + switch m.m { + case schema.Maybe_Absent: + return datamodel.Absent + case schema.Maybe_Null: + return datamodel.Null + case schema.Maybe_Value: + return &m.v + default: + panic("unreachable") + } +} +func (m MaybeBase64Url) Must() Base64Url { + if !m.Exists() { + panic("unbox of a maybe rejected") + } + return &m.v +} + +var _ datamodel.Node = (Base64Url)(&_Base64Url{}) +var _ schema.TypedNode = (Base64Url)(&_Base64Url{}) + +func (Base64Url) Kind() datamodel.Kind { + return datamodel.Kind_String +} +func (Base64Url) LookupByString(string) (datamodel.Node, error) { + return mixins.String{TypeName: "dagjose.Base64Url"}.LookupByString("") +} +func (Base64Url) LookupByNode(datamodel.Node) (datamodel.Node, error) { + return mixins.String{TypeName: "dagjose.Base64Url"}.LookupByNode(nil) +} +func (Base64Url) LookupByIndex(idx int64) (datamodel.Node, error) { + return mixins.String{TypeName: "dagjose.Base64Url"}.LookupByIndex(0) +} +func (Base64Url) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + return mixins.String{TypeName: "dagjose.Base64Url"}.LookupBySegment(seg) +} +func (Base64Url) MapIterator() datamodel.MapIterator { + return nil +} +func (Base64Url) ListIterator() datamodel.ListIterator { + return nil +} +func (Base64Url) Length() int64 { + return -1 +} +func (Base64Url) IsAbsent() bool { + return false +} +func (Base64Url) IsNull() bool { + return false +} +func (Base64Url) AsBool() (bool, error) { + return mixins.String{TypeName: "dagjose.Base64Url"}.AsBool() +} +func (Base64Url) AsInt() (int64, error) { + return mixins.String{TypeName: "dagjose.Base64Url"}.AsInt() +} +func (Base64Url) AsFloat() (float64, error) { + return mixins.String{TypeName: "dagjose.Base64Url"}.AsFloat() +} +func (n Base64Url) AsString() (string, error) { + return encodeBase64Url([]byte(n.x)), nil +} +func (n Base64Url) AsBytes() ([]byte, error) { + return []byte(n.x), nil +} +func (Base64Url) AsLink() (datamodel.Link, error) { + return mixins.String{TypeName: "dagjose.Base64Url"}.AsLink() +} +func (Base64Url) Prototype() datamodel.NodePrototype { + return _Base64Url__Prototype{} +} + +type _Base64Url__Prototype struct{} + +func (_Base64Url__Prototype) NewBuilder() datamodel.NodeBuilder { + var nb _Base64Url__Builder + nb.Reset() + return &nb +} + +type _Base64Url__Builder struct { + _Base64Url__Assembler +} + +func (nb *_Base64Url__Builder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_Base64Url__Builder) Reset() { + var w _Base64Url + var m schema.Maybe + *nb = _Base64Url__Builder{_Base64Url__Assembler{w: &w, m: &m}} +} + +type _Base64Url__Assembler struct { + w *_Base64Url + m *schema.Maybe +} + +func (na *_Base64Url__Assembler) reset() {} +func (_Base64Url__Assembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.Base64Url"}.BeginMap(0) +} +func (_Base64Url__Assembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.StringAssembler{TypeName: "dagjose.Base64Url"}.BeginList(0) +} +func (na *_Base64Url__Assembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.StringAssembler{TypeName: "dagjose.Base64Url"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + panic("unreachable") +} +func (_Base64Url__Assembler) AssignBool(bool) error { + return mixins.StringAssembler{TypeName: "dagjose.Base64Url"}.AssignBool(false) +} +func (_Base64Url__Assembler) AssignInt(int64) error { + return mixins.StringAssembler{TypeName: "dagjose.Base64Url"}.AssignInt(0) +} +func (_Base64Url__Assembler) AssignFloat(float64) error { + return mixins.StringAssembler{TypeName: "dagjose.Base64Url"}.AssignFloat(0) +} +func (na *_Base64Url__Assembler) AssignString(v string) error { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + if decodedBytes, err := decodeBase64Url(v); err != nil { + return err + } else { + na.w.x = string(decodedBytes) + *na.m = schema.Maybe_Value + return nil + } +} +func (na *_Base64Url__Assembler) AssignBytes(v []byte) error { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + na.w.x = string(v) + *na.m = schema.Maybe_Value + return nil +} +func (_Base64Url__Assembler) AssignLink(datamodel.Link) error { + return mixins.StringAssembler{TypeName: "dagjose.Base64Url"}.AssignLink(nil) +} +func (na *_Base64Url__Assembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_Base64Url); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v2, err := v.AsString(); err != nil { + if e, wrongKind := err.(datamodel.ErrWrongKind); wrongKind && (e.ActualKind == datamodel.Kind_Bytes) { + if v2, err := v.AsBytes(); err != nil { + return err + } else { + return na.AssignBytes(v2) + } + } + return err + } else { + return na.AssignString(v2) + } +} +func (_Base64Url__Assembler) Prototype() datamodel.NodePrototype { + return _Base64Url__Prototype{} +} +func (Base64Url) Type() schema.Type { + return nil +} +func (n Base64Url) Representation() datamodel.Node { + return (*_Base64Url__Repr)(n) +} + +type _Base64Url__Repr = _Base64Url + +var _ datamodel.Node = &_Base64Url__Repr{} + +type _Base64Url__ReprPrototype = _Base64Url__Prototype +type _Base64Url__ReprAssembler = _Base64Url__Assembler + +func (_Base64Url__Prototype) Link(n Base64Url) (Link, error) { + c, err := cid.Cast([]byte(n.x)) + if err != nil { + return nil, err + } + return &_Link{cidlink.Link{Cid: c}}, nil +} + +type _Raw__Maybe struct { + m schema.Maybe + v _Raw +} +type MaybeRaw = *_Raw__Maybe + +func (m MaybeRaw) IsNull() bool { + return m.m == schema.Maybe_Null +} +func (m MaybeRaw) IsAbsent() bool { + return m.m == schema.Maybe_Absent +} +func (m MaybeRaw) Exists() bool { + return m.m == schema.Maybe_Value +} +func (m MaybeRaw) AsNode() datamodel.Node { + switch m.m { + case schema.Maybe_Absent: + return datamodel.Absent + case schema.Maybe_Null: + return datamodel.Null + case schema.Maybe_Value: + return &m.v + default: + panic("unreachable") + } +} +func (m MaybeRaw) Must() Raw { + if !m.Exists() { + panic("unbox of a maybe rejected") + } + return &m.v +} + +var _ datamodel.Node = (Raw)(&_Raw{}) +var _ schema.TypedNode = (Raw)(&_Raw{}) + +func (Raw) Kind() datamodel.Kind { + return datamodel.Kind_Bytes +} +func (Raw) LookupByString(string) (datamodel.Node, error) { + return mixins.Bytes{TypeName: "dagjose.Raw"}.LookupByString("") +} +func (Raw) LookupByNode(datamodel.Node) (datamodel.Node, error) { + return mixins.Bytes{TypeName: "dagjose.Raw"}.LookupByNode(nil) +} +func (Raw) LookupByIndex(idx int64) (datamodel.Node, error) { + return mixins.Bytes{TypeName: "dagjose.Raw"}.LookupByIndex(0) +} +func (Raw) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { + return mixins.Bytes{TypeName: "dagjose.Raw"}.LookupBySegment(seg) +} +func (Raw) MapIterator() datamodel.MapIterator { + return nil +} +func (Raw) ListIterator() datamodel.ListIterator { + return nil +} +func (Raw) Length() int64 { + return -1 +} +func (Raw) IsAbsent() bool { + return false +} +func (Raw) IsNull() bool { + return false +} +func (Raw) AsBool() (bool, error) { + return mixins.Bytes{TypeName: "dagjose.Raw"}.AsBool() +} +func (Raw) AsInt() (int64, error) { + return mixins.Bytes{TypeName: "dagjose.Raw"}.AsInt() +} +func (Raw) AsFloat() (float64, error) { + return mixins.Bytes{TypeName: "dagjose.Raw"}.AsFloat() +} +func (n Raw) AsString() (string, error) { + return encodeBase64Url(n.x), nil +} +func (n Raw) AsBytes() ([]byte, error) { + return n.x, nil +} +func (Raw) AsLink() (datamodel.Link, error) { + return mixins.Bytes{TypeName: "dagjose.Raw"}.AsLink() +} +func (Raw) Prototype() datamodel.NodePrototype { + return _Raw__Prototype{} +} + +type _Raw__Prototype struct{} + +func (_Raw__Prototype) NewBuilder() datamodel.NodeBuilder { + var nb _Raw__Builder + nb.Reset() + return &nb +} + +type _Raw__Builder struct { + _Raw__Assembler +} + +func (nb *_Raw__Builder) Build() datamodel.Node { + if *nb.m != schema.Maybe_Value { + panic("invalid state: cannot call Build on an assembler that's not finished") + } + return nb.w +} +func (nb *_Raw__Builder) Reset() { + var w _Raw + var m schema.Maybe + *nb = _Raw__Builder{_Raw__Assembler{w: &w, m: &m}} +} + +type _Raw__Assembler struct { + w *_Raw + m *schema.Maybe +} + +func (na *_Raw__Assembler) reset() {} +func (_Raw__Assembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { + return mixins.BytesAssembler{TypeName: "dagjose.Raw"}.BeginMap(0) +} +func (_Raw__Assembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { + return mixins.BytesAssembler{TypeName: "dagjose.Raw"}.BeginList(0) +} +func (na *_Raw__Assembler) AssignNull() error { + switch *na.m { + case allowNull: + *na.m = schema.Maybe_Null + return nil + case schema.Maybe_Absent: + return mixins.BytesAssembler{TypeName: "dagjose.Raw"}.AssignNull() + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + panic("unreachable") +} +func (_Raw__Assembler) AssignBool(bool) error { + return mixins.BytesAssembler{TypeName: "dagjose.Raw"}.AssignBool(false) +} +func (_Raw__Assembler) AssignInt(int64) error { + return mixins.BytesAssembler{TypeName: "dagjose.Raw"}.AssignInt(0) +} +func (_Raw__Assembler) AssignFloat(float64) error { + return mixins.BytesAssembler{TypeName: "dagjose.Raw"}.AssignFloat(0) +} +func (na *_Raw__Assembler) AssignString(v string) error { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + if decodedBytes, err := decodeBase64Url(v); err != nil { + return err + } else { + na.w.x = decodedBytes + *na.m = schema.Maybe_Value + return nil + } +} +func (na *_Raw__Assembler) AssignBytes(v []byte) error { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + na.w.x = v + *na.m = schema.Maybe_Value + return nil +} +func (_Raw__Assembler) AssignLink(datamodel.Link) error { + return mixins.BytesAssembler{TypeName: "dagjose.Raw"}.AssignLink(nil) +} +func (na *_Raw__Assembler) AssignNode(v datamodel.Node) error { + if v.IsNull() { + return na.AssignNull() + } + if v2, ok := v.(*_Raw); ok { + switch *na.m { + case schema.Maybe_Value, schema.Maybe_Null: + panic("invalid state: cannot assign into assembler that's already finished") + } + *na.w = *v2 + *na.m = schema.Maybe_Value + return nil + } + if v2, err := v.AsBytes(); err != nil { + if e, wrongKind := err.(datamodel.ErrWrongKind); wrongKind && (e.ActualKind == datamodel.Kind_String) { + if v2, err := v.AsString(); err != nil { + return err + } else { + return na.AssignString(v2) + } + } + return err + } else { + return na.AssignBytes(v2) + } +} +func (_Raw__Assembler) Prototype() datamodel.NodePrototype { + return _Raw__Prototype{} +} +func (Raw) Type() schema.Type { + return nil +} +func (n Raw) Representation() datamodel.Node { + return (*_Raw__Repr)(n) +} + +type _Raw__Repr = _Raw + +var _ datamodel.Node = &_Raw__Repr{} + +type _Raw__ReprPrototype = _Raw__Prototype +type _Raw__ReprAssembler = _Raw__Assembler + +func encodeBase64Url(decoded []byte) string { + return base64.RawURLEncoding.EncodeToString(decoded) +} + +func decodeBase64Url(encoded string) ([]byte, error) { + decodedBytes, err := base64.RawURLEncoding.DecodeString(encoded) + return decodedBytes, err +} diff --git a/dagjose/jose_node.go b/dagjose/jose_node.go deleted file mode 100644 index 0911f9b..0000000 --- a/dagjose/jose_node.go +++ /dev/null @@ -1,168 +0,0 @@ -package dagjose - -import ( - ipld "github.com/ipld/go-ipld-prime" - "github.com/ipld/go-ipld-prime/fluent" - ipldBasicNode "github.com/ipld/go-ipld-prime/node/basic" -) - -type dagJOSENode struct{ *DagJOSE } - -func (d dagJOSENode) Kind() ipld.Kind { - return ipld.Kind_Map -} -func (d dagJOSENode) LookupByString(key string) (ipld.Node, error) { - if key == "payload" { - return ipldBasicNode.NewBytes(d.payload.Bytes()), nil - } - if key == "signatures" { - return &jwsSignaturesNode{d.signatures}, nil - } - if key == "protected" { - return bytesOrNil(d.protected), nil - } - if key == "unprotected" { - return bytesOrNil(d.unprotected), nil - } - if key == "iv" { - return bytesOrNil(d.iv), nil - } - if key == "aad" { - return bytesOrNil(d.aad), nil - } - if key == "ciphertext" { - return bytesOrNil(d.ciphertext), nil - } - if key == "tag" { - return bytesOrNil(d.tag), nil - } - if key == "recipients" { - if d.recipients != nil { - return fluent.MustBuildList( - ipldBasicNode.Prototype.List, - int64(len(d.recipients)), - func(la fluent.ListAssembler) { - for i := range d.recipients { - la.AssembleValue().AssignNode(jweRecipientNode{&d.recipients[i]}) - } - }, - ), nil - } - return nil, nil - } - return nil, nil -} -func (d dagJOSENode) LookupByNode(key ipld.Node) (ipld.Node, error) { - ks, err := key.AsString() - if err != nil { - return nil, err - } - return d.LookupByString(ks) -} -func (d dagJOSENode) LookupByIndex(idx int64) (ipld.Node, error) { - return nil, nil -} -func (d dagJOSENode) LookupBySegment(seg ipld.PathSegment) (ipld.Node, error) { - return d.LookupByString(seg.String()) -} -func (d dagJOSENode) MapIterator() ipld.MapIterator { - return &dagJOSEMapIterator{ - d: d, - index: 0, - } -} -func (d dagJOSENode) ListIterator() ipld.ListIterator { - return nil -} -func (d dagJOSENode) Length() int64 { - return int64(len((&dagJOSEMapIterator{d: d, index: 0}).presentKeys())) -} -func (d dagJOSENode) IsAbsent() bool { - return false -} -func (d dagJOSENode) IsNull() bool { - return false -} -func (d dagJOSENode) AsBool() (bool, error) { - return false, nil -} -func (d dagJOSENode) AsInt() (int64, error) { - return 0, nil -} -func (d dagJOSENode) AsFloat() (float64, error) { - return 0, nil -} -func (d dagJOSENode) AsString() (string, error) { - return "", nil -} -func (d dagJOSENode) AsBytes() ([]byte, error) { - return nil, nil -} -func (d dagJOSENode) AsLink() (ipld.Link, error) { - return nil, nil -} -func (d dagJOSENode) Prototype() ipld.NodePrototype { - return &DagJOSENodePrototype{} -} - -// end ipld.Node implementation - -func bytesOrNil(value []byte) ipld.Node { - if value != nil { - return ipldBasicNode.NewBytes(value) - } else { - return ipld.Absent - } -} - -type dagJOSEMapIterator struct { - d dagJOSENode - index int -} - -func (d *dagJOSEMapIterator) Next() (ipld.Node, ipld.Node, error) { - if d.Done() { - return nil, nil, ipld.ErrIteratorOverread{} - } - presentKeys := d.presentKeys() - key := presentKeys[d.index] - value, _ := d.d.LookupByString(key) - d.index += 1 - return ipldBasicNode.NewString(key), value, nil -} - -func (d *dagJOSEMapIterator) Done() bool { - return d.index >= len(d.presentKeys()) -} - -func (d *dagJOSEMapIterator) presentKeys() []string { - result := make([]string, 0) - if d.d.payload != nil { - result = append(result, "payload") - } - if d.d.signatures != nil { - result = append(result, "signatures") - } - if d.d.protected != nil { - result = append(result, "protected") - } - if d.d.unprotected != nil { - result = append(result, "unprotected") - } - if d.d.iv != nil { - result = append(result, "iv") - } - if d.d.aad != nil { - result = append(result, "aad") - } - if d.d.ciphertext != nil { - result = append(result, "ciphertext") - } - if d.d.tag != nil { - result = append(result, "tag") - } - if d.d.recipients != nil { - result = append(result, "recipients") - } - return result -} diff --git a/dagjose/json_serialization.go b/dagjose/json_serialization.go deleted file mode 100644 index 105d049..0000000 --- a/dagjose/json_serialization.go +++ /dev/null @@ -1,507 +0,0 @@ -package dagjose - -import ( - "encoding/base64" - "encoding/json" - "fmt" - "sort" - - "github.com/ipld/go-ipld-prime/fluent" - basicnode "github.com/ipld/go-ipld-prime/node/basic" - - "github.com/ipfs/go-cid" - ipld "github.com/ipld/go-ipld-prime" -) - -// Given a JSON string reresenting a JWS in either general or compact serialization this -// will return a DagJWS -func ParseJWS(jsonStr []byte) (*DagJWS, error) { - var rawJws struct { - Payload *string `json:"payload"` - Signatures []struct { - Protected *string `json:"protected"` - Signature string `json:"signature"` - Header map[string]interface{} `json:"header"` - } `json:"signatures"` - Protected *string `json:"protected"` - Signature *string `json:"signature"` - Header map[string]interface{} `json:"header"` - } - if err := json.Unmarshal(jsonStr, &rawJws); err != nil { - return nil, fmt.Errorf("error parsing jws json: %v", err) - } - result := DagJOSE{} - - if rawJws.Payload == nil { - return nil, fmt.Errorf("JWS has no payload property") - } - - if rawJws.Signature != nil && rawJws.Signatures != nil { - return nil, fmt.Errorf("JWS JSON cannot contain both a 'signature' and a 'signatures' key") - } - - payloadBytes, err := base64.RawURLEncoding.DecodeString(*rawJws.Payload) - if err != nil { - return nil, fmt.Errorf("error parsing payload: %v", err) - } - _, cid, err := cid.CidFromBytes(payloadBytes) - if err != nil { - panic(fmt.Errorf("error parsing payload: payload is not a CID")) - } - result.payload = &cid - - var sigs []jwsSignature - if rawJws.Signature != nil { - sig := jwsSignature{} - - sigBytes, err := base64.RawURLEncoding.DecodeString(*rawJws.Signature) - if err != nil { - return nil, fmt.Errorf("error decoding signature: %v", err) - } - sig.signature = sigBytes - - if rawJws.Protected != nil { - protectedBytes, err := base64.RawURLEncoding.DecodeString(*rawJws.Protected) - if err != nil { - return nil, fmt.Errorf("error parsing signature: %v", err) - } - sig.protected = protectedBytes - } - - if rawJws.Header != nil { - header := make(map[string]ipld.Node) - for key, v := range rawJws.Header { - node, err := goPrimitiveToIpldBasicNode(v) - if err != nil { - return nil, fmt.Errorf("error converting header value for key '%s' of to ipld: %v", key, err) - } - header[key] = node - } - sig.header = header - } - sigs = append(sigs, sig) - } else if rawJws.Signatures != nil { - sigs = make([]jwsSignature, 0, len(rawJws.Signatures)) - for idx, rawSig := range rawJws.Signatures { - sig := jwsSignature{} - if rawSig.Protected != nil { - protectedBytes, err := base64.RawURLEncoding.DecodeString(*rawSig.Protected) - if err != nil { - return nil, fmt.Errorf("error parsing signatures[%d]['protected']: %v", idx, err) - } - sig.protected = protectedBytes - } - - if rawSig.Header != nil { - header := make(map[string]ipld.Node) - for key, v := range rawSig.Header { - node, err := goPrimitiveToIpldBasicNode(v) - if err != nil { - return nil, fmt.Errorf("error converting header value for key '%s' of sign %d to ipld: %v", key, idx, err) - } - header[key] = node - } - sig.header = header - } - - sigBytes, err := base64.RawURLEncoding.DecodeString(rawSig.Signature) - if err != nil { - return nil, fmt.Errorf("error decoding signature for signature %d: %v", idx, err) - } - sig.signature = sigBytes - sigs = append(sigs, sig) - } - } - result.signatures = sigs - - return &DagJWS{&result}, nil -} - -// Given a JSON string reresenting a JWE in either general or compact serialization this -// will return a DagJWE -func ParseJWE(jsonStr []byte) (*DagJWE, error) { - var rawJwe struct { - Protected *string `json:"protected"` - Unprotected *string `json:"unprotected"` - Iv *string `json:"iv"` - Aad *string `json:"aad"` - Ciphertext *string `json:"ciphertext"` - Tag *string `json:"tag"` - Recipients []struct { - Header map[string]interface{} `json:"header"` - EncryptedKey *string `json:"encrypted_key"` - } `json:"recipients"` - Header map[string]interface{} `json:"header"` - EncryptedKey *string `json:"encrypted_key"` - } - - if err := json.Unmarshal(jsonStr, &rawJwe); err != nil { - return nil, fmt.Errorf("error parsing JWE json: %v", err) - } - - if (rawJwe.Header != nil || rawJwe.EncryptedKey != nil) && rawJwe.Recipients != nil { - return nil, fmt.Errorf("JWE JSON cannot contain 'recipients' and either 'encrypted_key' or 'header'") - } - - resultJose := DagJOSE{} - - if rawJwe.Ciphertext == nil { - return nil, fmt.Errorf("JWE has no ciphertext property") - } - ciphertextBytes, err := base64.RawURLEncoding.DecodeString(*rawJwe.Ciphertext) - if err != nil { - return nil, fmt.Errorf("error parsing ciphertext: %v", err) - } - resultJose.ciphertext = ciphertextBytes - - if rawJwe.Protected != nil { - protectedBytes, err := base64.RawURLEncoding.DecodeString(*rawJwe.Protected) - if err != nil { - return nil, fmt.Errorf("error parsing protected: %v", err) - } - resultJose.protected = protectedBytes - } - - var recipients []jweRecipient - if rawJwe.Header != nil || rawJwe.EncryptedKey != nil { - recipient := jweRecipient{} - if rawJwe.EncryptedKey != nil { - keyBytes, err := base64.RawURLEncoding.DecodeString(*rawJwe.EncryptedKey) - if err != nil { - return nil, fmt.Errorf("error parsing encrypted_key: %v", err) - } - recipient.encrypted_key = keyBytes - } - - if rawJwe.Header != nil { - header := make(map[string]ipld.Node) - for key, v := range rawJwe.Header { - node, err := goPrimitiveToIpldBasicNode(v) - if err != nil { - return nil, fmt.Errorf("error converting header value for key '%s' of recipient to ipld: %v", key, err) - } - header[key] = node - } - recipient.header = header - } - recipients = append(recipients, recipient) - } else if rawJwe.Recipients != nil { - recipients = make([]jweRecipient, 0, len(rawJwe.Recipients)) - for idx, rawRecipient := range rawJwe.Recipients { - recipient := jweRecipient{} - if rawRecipient.EncryptedKey != nil { - keyBytes, err := base64.RawURLEncoding.DecodeString(*rawRecipient.EncryptedKey) - if err != nil { - return nil, fmt.Errorf("error parsing encrypted_key for recipient %d: %v", idx, err) - } - recipient.encrypted_key = keyBytes - } - - if rawRecipient.Header != nil { - header := make(map[string]ipld.Node) - for key, v := range rawRecipient.Header { - node, err := goPrimitiveToIpldBasicNode(v) - if err != nil { - return nil, fmt.Errorf("error converting header value for key '%s' of recipient %d to ipld: %v", key, idx, err) - } - header[key] = node - } - recipient.header = header - } - recipients = append(recipients, recipient) - } - } - resultJose.recipients = recipients - - if rawJwe.Unprotected != nil { - unprotectedBytes, err := base64.RawURLEncoding.DecodeString(*rawJwe.Unprotected) - if err != nil { - return nil, fmt.Errorf("error parsing unprotected: %v", err) - } - resultJose.unprotected = unprotectedBytes - } - - if rawJwe.Iv != nil { - ivBytes, err := base64.RawURLEncoding.DecodeString(*rawJwe.Iv) - if err != nil { - return nil, fmt.Errorf("error parsing iv: %v", err) - } - resultJose.iv = ivBytes - } - - if rawJwe.Aad != nil { - aadBytes, err := base64.RawURLEncoding.DecodeString(*rawJwe.Aad) - if err != nil { - return nil, fmt.Errorf("error parsing aad: %v", err) - } - resultJose.aad = aadBytes - } - - if rawJwe.Tag != nil { - tagBytes, err := base64.RawURLEncoding.DecodeString(*rawJwe.Tag) - if err != nil { - return nil, fmt.Errorf("error parsing tag: %v", err) - } - resultJose.tag = tagBytes - } - - return &DagJWE{&resultJose}, nil -} - -func (d *DagJWS) asJson() map[string]interface{} { - jsonJose := make(map[string]interface{}) - jsonJose["payload"] = base64.RawURLEncoding.EncodeToString(d.dagjose.payload.Bytes()) - - if d.dagjose.signatures != nil { - sigs := make([]map[string]interface{}, 0, len(d.dagjose.signatures)) - for _, sig := range d.dagjose.signatures { - jsonSig := make(map[string]interface{}, len(d.dagjose.signatures)) - if sig.protected != nil { - jsonSig["protected"] = base64.RawURLEncoding.EncodeToString(sig.protected) - } - if sig.signature != nil { - jsonSig["signature"] = base64.RawURLEncoding.EncodeToString(sig.signature) - } - if sig.header != nil { - jsonHeader := make(map[string]interface{}, len(sig.header)) - for key, val := range sig.header { - goVal, err := ipldNodeToGo(val) - if err != nil { - panic(fmt.Errorf("GeneralJSONSerialization: error converting %v to go: %v", val, err)) - } - jsonHeader[key] = goVal - } - jsonSig["header"] = jsonHeader - } - sigs = append(sigs, jsonSig) - } - jsonJose["signatures"] = sigs - } - return jsonJose -} - -// Return the general json serialization of this JWS -func (d *DagJWS) GeneralJSONSerialization() []byte { - jsonRep := d.asJson() - result, err := json.Marshal(jsonRep) - if err != nil { - panic(fmt.Errorf("error marshaling JWS to json: %v", err)) - } - return result -} - -// Return the flattened json serialization of this JWS -func (d *DagJWS) FlattenedSerialization() ([]byte, error) { - if len(d.dagjose.signatures) != 1 { - return nil, fmt.Errorf("Cannot create a flattened serialization for a JWS with more than one signature") - } - jsonRep := d.asJson() - jsonSignature := jsonRep["signatures"].([]map[string]interface{})[0] - jsonRep["protected"] = jsonSignature["protected"] - jsonRep["header"] = jsonSignature["header"] - jsonRep["signature"] = jsonSignature["signature"] - delete(jsonRep, "signatures") - result, err := json.Marshal(jsonRep) - if err != nil { - panic(fmt.Errorf("error marshaling flattened JWS serialization to JSON: %v", err)) - } - return result, nil -} - -// Return the general json serialization of this JWE -func (d *DagJWE) GeneralJSONSerialization() []byte { - jsonRep := d.asJson() - result, err := json.Marshal(jsonRep) - if err != nil { - panic(fmt.Errorf("error marshaling JWE to json: %v", err)) - } - return result -} - -// Return the flattened json serialization of this JWE -func (d *DagJWE) FlattenedSerialization() ([]byte, error) { - jsonRep := d.asJson() - jsonRecipient := jsonRep["recipients"].([]map[string]interface{})[0] - jsonRep["header"] = jsonRecipient["header"] - jsonRep["encrypted_key"] = jsonRecipient["encrypted_key"] - delete(jsonRep, "recipients") - result, err := json.Marshal(jsonRep) - if err != nil { - panic(fmt.Errorf("error marshaling flattened JWE serialization to JSON: %v", err)) - } - return result, nil -} - -func (d *DagJWE) asJson() map[string]interface{} { - jsonJose := make(map[string]interface{}) - - if d.dagjose.protected != nil { - jsonJose["protected"] = base64.RawURLEncoding.EncodeToString(d.dagjose.protected) - } - if d.dagjose.unprotected != nil { - jsonJose["unprotected"] = base64.RawURLEncoding.EncodeToString(d.dagjose.unprotected) - } - if d.dagjose.iv != nil { - jsonJose["iv"] = base64.RawURLEncoding.EncodeToString(d.dagjose.iv) - } - if d.dagjose.aad != nil { - jsonJose["aad"] = base64.RawURLEncoding.EncodeToString(d.dagjose.aad) - } - jsonJose["ciphertext"] = base64.RawURLEncoding.EncodeToString(d.dagjose.ciphertext) - if d.dagjose.tag != nil { - jsonJose["tag"] = base64.RawURLEncoding.EncodeToString(d.dagjose.tag) - } - - if d.dagjose.recipients != nil { - recipients := make([]map[string]interface{}, 0, len(d.dagjose.recipients)) - for _, r := range d.dagjose.recipients { - recipientJson := make(map[string]interface{}) - if r.encrypted_key != nil { - recipientJson["encrypted_key"] = base64.RawURLEncoding.EncodeToString(r.encrypted_key) - } - if r.header != nil { - jsonHeader := make(map[string]interface{}, len(r.header)) - for key, val := range r.header { - goVal, err := ipldNodeToGo(val) - if err != nil { - panic(fmt.Errorf("GeneralJSONSerialization: unable to convert %v from recipient header to go value: %v", val, err)) - } - jsonHeader[key] = goVal - } - recipientJson["header"] = jsonHeader - } - recipients = append(recipients, recipientJson) - } - jsonJose["recipients"] = recipients - } - return jsonJose -} - -func goPrimitiveToIpldBasicNode(value interface{}) (ipld.Node, error) { - switch v := value.(type) { - case int: - return basicnode.NewInt(int64(v)), nil - case float32: - return basicnode.NewFloat(float64(v)), nil - case float64: - return basicnode.NewFloat(v), nil - case bool: - return basicnode.NewBool(v), nil - case string: - return basicnode.NewString(v), nil - case map[string]interface{}: - // Note that here we sort the keys before creating the map. This is - // because ordering of map keys is not defined in Go (or in JSON, which - // is where this map is coming from in the first place) but order can - // be meaningful in IPLD, so we specify that the map is in key order - return fluent.MustBuildMap( - basicnode.Prototype.Map, - int64(len(v)), - func(ma fluent.MapAssembler) { - type kv struct { - key string - value ipld.Node - } - kvs := make([]kv, 0) - for k, v := range v { - value, err := goPrimitiveToIpldBasicNode(v) - if err != nil { - panic(fmt.Errorf("unable to convert primitive value %v to ipld Node: %v", v, err)) - } - kvs = append(kvs, kv{key: k, value: value}) - } - sort.SliceStable(kvs, func(i int, j int) bool { - return kvs[i].key < kvs[j].key - }) - for _, kv := range kvs { - ma.AssembleEntry(kv.key).AssignNode(kv.value) - } - }, - ), nil - case []interface{}: - return fluent.MustBuildList( - basicnode.Prototype.List, - int64(len(v)), - func(la fluent.ListAssembler) { - for _, v := range v { - value, err := goPrimitiveToIpldBasicNode(v) - if err != nil { - panic(fmt.Errorf("unable to convert primitive value %v to ipld Node: %v", v, err)) - } - la.AssembleValue().AssignNode(value) - } - }, - ), nil - case nil: - return ipld.Null, nil - default: - return nil, fmt.Errorf("cannot convert %v to an ipld node", v) - } -} - -func ipldNodeToGo(node ipld.Node) (interface{}, error) { - switch node.Kind() { - case ipld.Kind_Bool: - return node.AsBool() - case ipld.Kind_Bytes: - return node.AsBytes() - case ipld.Kind_Int: - return node.AsInt() - case ipld.Kind_Float: - return node.AsFloat() - case ipld.Kind_String: - return node.AsString() - case ipld.Kind_Link: - lnk, err := node.AsLink() - if err != nil { - return nil, fmt.Errorf("ipldNodeToGo: error parsing node as link even thought kind is link: %v", err) - } - return map[string]string{ - "/": lnk.String(), - }, nil - case ipld.Kind_Map: - mapIterator := node.MapIterator() - if mapIterator == nil { - return nil, fmt.Errorf("ipldNodeToGo: nil MapIterator returned from map node") - } - result := make(map[string]interface{}) - for !mapIterator.Done() { - k, v, err := mapIterator.Next() - if err != nil { - return nil, fmt.Errorf("ipldNodeToGo: error whilst iterating over map: %v", err) - } - key, err := k.AsString() - if err != nil { - return nil, fmt.Errorf("ipldNodeToGo: unable to convert map key to string: %v", err) - } - goVal, err := ipldNodeToGo(v) - if err != nil { - return nil, fmt.Errorf("ipldNodeToGo: error converting map value to go: %v", err) - } - result[key] = goVal - } - return result, nil - case ipld.Kind_List: - listIterator := node.ListIterator() - if listIterator == nil { - return nil, fmt.Errorf("ipldNodeToGo: nil listiterator returned from node with list kind") - } - result := make([]interface{}, 0) - for !listIterator.Done() { - _, next, err := listIterator.Next() - if err != nil { - return nil, fmt.Errorf("ipldNodeToGo: error iterating over list node: %v", err) - } - val, err := ipldNodeToGo(next) - if err != nil { - return nil, fmt.Errorf("ipldNodeToGo: error converting list element to go: %v", err) - } - result = append(result, val) - } - return result, nil - case ipld.Kind_Null: - return nil, nil - default: - return nil, fmt.Errorf("ipldNodeToGo: Unknown ipld node kind: %s", node.Kind().String()) - } -} diff --git a/dagjose/jwe_recipient_assembler.go b/dagjose/jwe_recipient_assembler.go deleted file mode 100644 index 82c1403..0000000 --- a/dagjose/jwe_recipient_assembler.go +++ /dev/null @@ -1,133 +0,0 @@ -package dagjose - -import ( - "fmt" - - ipld "github.com/ipld/go-ipld-prime" - basicnode "github.com/ipld/go-ipld-prime/node/basic" - "github.com/ipld/go-ipld-prime/node/mixins" -) - -type jweRecipientAssembler struct { - recipient *jweRecipient - key *string - state maState -} - -var jweRecipientMixin = mixins.MapAssembler{TypeName: "JOSERecipient"} - -func (j *jweRecipientAssembler) BeginMap(sizeHint int64) (ipld.MapAssembler, error) { - if j.state == maState_midValue && *j.key == "header" { - j.recipient.header = make(map[string]ipld.Node) - j.state = maState_initial - return &headerAssembler{ - header: j.recipient.header, - key: nil, - state: maState_initial, - }, nil - } - if j.state != maState_initial { - panic("misuse") - } - return j, nil -} -func (j *jweRecipientAssembler) BeginList(sizeHint int64) (ipld.ListAssembler, error) { - return jweRecipientMixin.BeginList(sizeHint) -} -func (j *jweRecipientAssembler) AssignNull() error { - if j.state == maState_midValue { - switch *j.key { - case "header": - j.recipient.header = nil - case "encrypted_key": - j.recipient.encrypted_key = nil - default: - panic("should never happen due to validation in map assembler") - } - return nil - } - return jweRecipientMixin.AssignNull() -} -func (j *jweRecipientAssembler) AssignBool(b bool) error { - return jweRecipientMixin.AssignBool(b) -} -func (j *jweRecipientAssembler) AssignInt(i int64) error { - return jweRecipientMixin.AssignInt(i) -} -func (j *jweRecipientAssembler) AssignFloat(f float64) error { - return jweRecipientMixin.AssignFloat(f) -} -func (j *jweRecipientAssembler) AssignString(s string) error { - if j.state == maState_midKey { - if !isValidJWERecipientKey(s) { - return fmt.Errorf("%s is not a valid JWE recipient key", s) - } - j.key = &s - j.state = maState_expectValue - return nil - } - return jweRecipientMixin.AssignString(s) -} -func (j *jweRecipientAssembler) AssignBytes(b []byte) error { - if j.state == maState_midValue { - if *j.key == "encrypted_key" { - j.recipient.encrypted_key = b - j.state = maState_initial - return nil - } - panic("should not be possible due to validation in map assembler") - } - return jweRecipientMixin.AssignBytes(b) -} -func (j *jweRecipientAssembler) AssignLink(l ipld.Link) error { - return jweRecipientMixin.AssignLink(l) -} -func (j *jweRecipientAssembler) AssignNode(n ipld.Node) error { - return fmt.Errorf("not implemented") -} -func (j *jweRecipientAssembler) Prototype() ipld.NodePrototype { - return basicnode.Prototype.Map -} - -func (j *jweRecipientAssembler) AssembleKey() ipld.NodeAssembler { - if j.state != maState_initial { - panic("misuse") - } - j.state = maState_midKey - return j -} - -func (j *jweRecipientAssembler) AssembleValue() ipld.NodeAssembler { - if j.state != maState_expectValue { - panic("misuse") - } - j.state = maState_midValue - return j -} -func (j *jweRecipientAssembler) AssembleEntry(k string) (ipld.NodeAssembler, error) { - if j.state != maState_initial { - panic("misuse") - } - j.key = &k - j.state = maState_midValue - return j, nil -} - -func (j *jweRecipientAssembler) KeyPrototype() ipld.NodePrototype { - return basicnode.Prototype.String -} -func (j *jweRecipientAssembler) ValuePrototype(k string) ipld.NodePrototype { - return basicnode.Prototype.Any -} - -func (j *jweRecipientAssembler) Finish() error { - if j.state != maState_initial { - panic("misuse") - } - j.state = maState_finished - return nil -} - -func isValidJWERecipientKey(key string) bool { - return key == "encrypted_key" || key == "header" -} diff --git a/dagjose/jwe_recipient_list_assembler.go b/dagjose/jwe_recipient_list_assembler.go deleted file mode 100644 index 3bccfcc..0000000 --- a/dagjose/jwe_recipient_list_assembler.go +++ /dev/null @@ -1,25 +0,0 @@ -package dagjose - -import ( - ipld "github.com/ipld/go-ipld-prime" - basicnode "github.com/ipld/go-ipld-prime/node/basic" -) - -type jweRecipientListAssembler struct{ d *DagJOSE } - -func (l *jweRecipientListAssembler) AssembleValue() ipld.NodeAssembler { - l.d.recipients = append(l.d.recipients, jweRecipient{}) - nextRef := &l.d.recipients[len(l.d.recipients)-1] - return &jweRecipientAssembler{ - recipient: nextRef, - key: nil, - state: maState_initial, - } -} - -func (l *jweRecipientListAssembler) Finish() error { - return nil -} -func (l *jweRecipientListAssembler) ValuePrototype(idx int64) ipld.NodePrototype { - return basicnode.Prototype.Map -} diff --git a/dagjose/jwe_recipient_node.go b/dagjose/jwe_recipient_node.go deleted file mode 100644 index f466c37..0000000 --- a/dagjose/jwe_recipient_node.go +++ /dev/null @@ -1,117 +0,0 @@ -package dagjose - -import ( - ipld "github.com/ipld/go-ipld-prime" - "github.com/ipld/go-ipld-prime/fluent" - basicnode "github.com/ipld/go-ipld-prime/node/basic" - "github.com/ipld/go-ipld-prime/node/mixins" -) - -type jweRecipientNode struct{ *jweRecipient } - -func (r jweRecipientNode) Kind() ipld.Kind { - return ipld.Kind_Map -} -func (r jweRecipientNode) LookupByString(key string) (ipld.Node, error) { - if key == "header" { - return fluent.MustBuildMap( - basicnode.Prototype.Map, - int64(len(r.header)), - func(ma fluent.MapAssembler) { - for key, value := range r.header { - ma.AssembleEntry(key).AssignNode(value) - } - }, - ), nil - } - if key == "encrypted_key" { - return bytesOrNil(r.encrypted_key), nil - } - return nil, nil -} -func (r jweRecipientNode) LookupByNode(key ipld.Node) (ipld.Node, error) { - str, err := key.AsString() - if err != nil { - return nil, nil - } - return r.LookupByString(str) -} -func (r jweRecipientNode) LookupByIndex(idx int64) (ipld.Node, error) { - return mixins.Map{TypeName: "dagjose.JWERecipient"}.LookupByIndex(idx) -} -func (r jweRecipientNode) LookupBySegment(seg ipld.PathSegment) (ipld.Node, error) { - return r.LookupByString(seg.String()) -} -func (r jweRecipientNode) MapIterator() ipld.MapIterator { - return &jweRecipientMapIterator{r: r, index: 0} -} -func (r jweRecipientNode) ListIterator() ipld.ListIterator { - return nil -} -func (r jweRecipientNode) Length() int64 { - if r.encrypted_key == nil && r.header == nil { - return 0 - } - if r.encrypted_key != nil && r.header != nil { - return 2 - } - return 1 -} -func (r jweRecipientNode) IsAbsent() bool { - return false -} -func (r jweRecipientNode) IsNull() bool { - return false -} -func (r jweRecipientNode) AsBool() (bool, error) { - return mixins.Map{TypeName: "dagjose.JWERecipient"}.AsBool() -} -func (r jweRecipientNode) AsInt() (int64, error) { - return mixins.Map{TypeName: "dagjose.JWERecipient"}.AsInt() -} -func (r jweRecipientNode) AsFloat() (float64, error) { - return mixins.Map{TypeName: "dagjose.JWERecipient"}.AsFloat() -} -func (r jweRecipientNode) AsString() (string, error) { - return mixins.Map{TypeName: "dagjose.JWERecipient"}.AsString() -} -func (r jweRecipientNode) AsBytes() ([]byte, error) { - return mixins.Map{TypeName: "dagjose.JWERecipient"}.AsBytes() -} -func (r jweRecipientNode) AsLink() (ipld.Link, error) { - return mixins.Map{TypeName: "dagjose.JWERecipient"}.AsLink() -} -func (r jweRecipientNode) Prototype() ipld.NodePrototype { - return nil -} - -type jweRecipientMapIterator struct { - r jweRecipientNode - index int -} - -func (j *jweRecipientMapIterator) Next() (ipld.Node, ipld.Node, error) { - if j.Done() { - return nil, nil, ipld.ErrIteratorOverread{} - } - presentKeys := j.presentKeys() - key := presentKeys[j.index] - value, _ := j.r.LookupByString(key) - j.index += 1 - return basicnode.NewString(key), value, nil -} - -func (j *jweRecipientMapIterator) Done() bool { - return j.index >= len(j.presentKeys()) -} - -func (j *jweRecipientMapIterator) presentKeys() []string { - result := make([]string, 0) - if j.r.header != nil { - result = append(result, "header") - } - if j.r.encrypted_key != nil { - result = append(result, "encrypted_key") - } - return result -} diff --git a/dagjose/jws_signature_assembler.go b/dagjose/jws_signature_assembler.go deleted file mode 100644 index d1d41c8..0000000 --- a/dagjose/jws_signature_assembler.go +++ /dev/null @@ -1,140 +0,0 @@ -package dagjose - -import ( - "fmt" - - ipld "github.com/ipld/go-ipld-prime" - basicnode "github.com/ipld/go-ipld-prime/node/basic" - "github.com/ipld/go-ipld-prime/node/mixins" -) - -type jwsSignatureAssembler struct { - signature *jwsSignature - key *string - state maState -} - -var jwsSignatureMixin = mixins.MapAssembler{TypeName: "JWSSignature"} - -func (j *jwsSignatureAssembler) BeginMap(sizeHint int64) (ipld.MapAssembler, error) { - if j.state == maState_midValue && *j.key == "header" { - j.signature.header = make(map[string]ipld.Node) - j.state = maState_initial - return &headerAssembler{ - header: j.signature.header, - key: nil, - state: maState_initial, - }, nil - } - if j.state != maState_initial { - panic("misuse") - } - return j, nil -} -func (j *jwsSignatureAssembler) BeginList(sizeHint int64) (ipld.ListAssembler, error) { - return jwsSignatureMixin.BeginList(sizeHint) -} -func (j *jwsSignatureAssembler) AssignNull() error { - if j.state == maState_midValue { - switch *j.key { - case "header": - j.signature.header = nil - case "protected": - j.signature.protected = nil - case "signature": - j.signature.signature = nil - default: - panic("should never happen due to validation in map assembler") - } - return nil - } - return jwsSignatureMixin.AssignNull() -} -func (j *jwsSignatureAssembler) AssignBool(b bool) error { - return jwsSignatureMixin.AssignBool(b) -} -func (j *jwsSignatureAssembler) AssignInt(i int64) error { - return jwsSignatureMixin.AssignInt(i) -} -func (j *jwsSignatureAssembler) AssignFloat(f float64) error { - return jwsSignatureMixin.AssignFloat(f) -} -func (j *jwsSignatureAssembler) AssignString(s string) error { - if j.state == maState_midKey { - if !isValidJWSSignatureKey(s) { - return fmt.Errorf("%s is not a vliad JWS signature key", s) - } - j.key = &s - j.state = maState_expectValue - return nil - } - return jwsSignatureMixin.AssignString(s) -} -func (j *jwsSignatureAssembler) AssignBytes(b []byte) error { - if j.state == maState_midValue { - if *j.key == "protected" { - j.signature.protected = b - j.state = maState_initial - return nil - } - if *j.key == "signature" { - j.signature.signature = b - j.state = maState_initial - return nil - } - panic("should not be possible due to validation in map assembler") - } - return jwsSignatureMixin.AssignBytes(b) -} -func (j *jwsSignatureAssembler) AssignLink(l ipld.Link) error { - return jwsSignatureMixin.AssignLink(l) -} -func (j *jwsSignatureAssembler) AssignNode(n ipld.Node) error { - return fmt.Errorf("not implemented") -} -func (j *jwsSignatureAssembler) Prototype() ipld.NodePrototype { - return basicnode.Prototype.Map -} - -func (j *jwsSignatureAssembler) AssembleKey() ipld.NodeAssembler { - if j.state != maState_initial { - panic("misuse") - } - j.state = maState_midKey - return j -} - -func (j *jwsSignatureAssembler) AssembleValue() ipld.NodeAssembler { - if j.state != maState_expectValue { - panic("misuse") - } - j.state = maState_midValue - return j -} -func (j *jwsSignatureAssembler) AssembleEntry(k string) (ipld.NodeAssembler, error) { - if j.state != maState_initial { - panic("misuse") - } - j.key = &k - j.state = maState_midValue - return j, nil -} - -func (j *jwsSignatureAssembler) KeyPrototype() ipld.NodePrototype { - return basicnode.Prototype.String -} -func (j *jwsSignatureAssembler) ValuePrototype(k string) ipld.NodePrototype { - return basicnode.Prototype.Any -} - -func (j *jwsSignatureAssembler) Finish() error { - if j.state != maState_initial { - panic("misuse") - } - j.state = maState_finished - return nil -} - -func isValidJWSSignatureKey(key string) bool { - return key == "protected" || key == "header" || key == "signature" -} diff --git a/dagjose/jws_signature_list_assembler.go b/dagjose/jws_signature_list_assembler.go deleted file mode 100644 index a064169..0000000 --- a/dagjose/jws_signature_list_assembler.go +++ /dev/null @@ -1,25 +0,0 @@ -package dagjose - -import ( - ipld "github.com/ipld/go-ipld-prime" - basicnode "github.com/ipld/go-ipld-prime/node/basic" -) - -type jwsSignatureListAssembler struct{ d *DagJOSE } - -func (l *jwsSignatureListAssembler) AssembleValue() ipld.NodeAssembler { - l.d.signatures = append(l.d.signatures, jwsSignature{}) - sigRef := &l.d.signatures[len(l.d.signatures)-1] - return &jwsSignatureAssembler{ - signature: sigRef, - key: nil, - state: maState_initial, - } -} - -func (l *jwsSignatureListAssembler) Finish() error { - return nil -} -func (l *jwsSignatureListAssembler) ValuePrototype(idx int64) ipld.NodePrototype { - return basicnode.Prototype.Map -} diff --git a/dagjose/jws_signature_node.go b/dagjose/jws_signature_node.go deleted file mode 100644 index c0c0403..0000000 --- a/dagjose/jws_signature_node.go +++ /dev/null @@ -1,220 +0,0 @@ -package dagjose - -import ( - "strconv" - - ipld "github.com/ipld/go-ipld-prime" - "github.com/ipld/go-ipld-prime/fluent" - basicnode "github.com/ipld/go-ipld-prime/node/basic" - "github.com/ipld/go-ipld-prime/node/mixins" -) - -type jwsSignaturesNode struct{ sigs []jwsSignature } - -// jwsSignatures Node implementation - -func (d *jwsSignaturesNode) Kind() ipld.Kind { - return ipld.Kind_List -} -func (d *jwsSignaturesNode) LookupByString(key string) (ipld.Node, error) { - index, err := strconv.Atoi(key) - if err != nil { - return nil, nil - } - return d.LookupByIndex(int64(index)) -} -func (d *jwsSignaturesNode) LookupByNode(key ipld.Node) (ipld.Node, error) { - index, err := key.AsInt() - if err != nil { - return nil, err - } - return d.LookupByIndex(index) -} -func (d *jwsSignaturesNode) LookupByIndex(idx int64) (ipld.Node, error) { - if int64(len(d.sigs)) > idx { - return jwsSignatureNode{&d.sigs[idx]}, nil - } - return nil, nil -} -func (d *jwsSignaturesNode) LookupBySegment(seg ipld.PathSegment) (ipld.Node, error) { - idx, err := seg.Index() - if err != nil { - return nil, nil - } - return d.LookupByIndex(idx) -} -func (d *jwsSignaturesNode) MapIterator() ipld.MapIterator { - return nil -} -func (d *jwsSignaturesNode) ListIterator() ipld.ListIterator { - return &jwsSignaturesIterator{ - sigs: d.sigs, - index: 0, - } -} -func (d *jwsSignaturesNode) Length() int64 { - return int64(len(d.sigs)) -} -func (d *jwsSignaturesNode) IsAbsent() bool { - return false -} -func (d *jwsSignaturesNode) IsNull() bool { - return false -} -func (d *jwsSignaturesNode) AsBool() (bool, error) { - return mixins.List{TypeName: "jose.JWSSignature"}.AsBool() -} -func (d *jwsSignaturesNode) AsInt() (int64, error) { - return mixins.List{TypeName: "jose.JWSSignature"}.AsInt() -} -func (d *jwsSignaturesNode) AsFloat() (float64, error) { - return mixins.List{TypeName: "jose.JWSSignature"}.AsFloat() -} -func (d *jwsSignaturesNode) AsString() (string, error) { - return mixins.List{TypeName: "jose.JWSSignature"}.AsString() -} -func (d *jwsSignaturesNode) AsBytes() ([]byte, error) { - return mixins.List{TypeName: "jose.JWSSignature"}.AsBytes() -} -func (d *jwsSignaturesNode) AsLink() (ipld.Link, error) { - return mixins.List{TypeName: "jose.JWSSignature"}.AsLink() -} -func (d *jwsSignaturesNode) Prototype() ipld.NodePrototype { - return nil -} - -// joseSignaturesNode ListIterator implementation - -type jwsSignaturesIterator struct { - sigs []jwsSignature - index int -} - -func (j *jwsSignaturesIterator) Next() (idx int64, value ipld.Node, err error) { - if j.Done() { - return 0, nil, ipld.ErrIteratorOverread{} - } - result := &j.sigs[j.index] - j.index += 1 - return int64(j.index), jwsSignatureNode{result}, nil -} - -func (j *jwsSignaturesIterator) Done() bool { - return j.index >= len(j.sigs) -} - -// end ipld.Node implementation - -// JOSESignature Node implementation - -type jwsSignatureNode struct{ *jwsSignature } - -func (d jwsSignatureNode) Kind() ipld.Kind { - return ipld.Kind_Map -} -func (d jwsSignatureNode) LookupByString(key string) (ipld.Node, error) { - if key == "signature" { - return basicnode.NewBytes(d.signature), nil - } - if key == "protected" { - return basicnode.NewBytes(d.protected), nil - } - if key == "header" { - if d.header == nil { - return nil, nil - } - return fluent.MustBuildMap( - basicnode.Prototype.Map, - int64(len(d.header)), - func(ma fluent.MapAssembler) { - for key, value := range d.header { - ma.AssembleEntry(key).AssignNode(value) - } - }, - ), nil - } - return nil, nil -} -func (d jwsSignatureNode) LookupByNode(key ipld.Node) (ipld.Node, error) { - keyString, err := key.AsString() - if err != nil { - return nil, err - } - return d.LookupByString(keyString) -} -func (d jwsSignatureNode) LookupByIndex(idx int64) (ipld.Node, error) { - return nil, nil -} - -func (d jwsSignatureNode) LookupBySegment(seg ipld.PathSegment) (ipld.Node, error) { - return d.LookupByString(seg.String()) -} -func (d jwsSignatureNode) MapIterator() ipld.MapIterator { - return &jwsSignatureMapIterator{sig: d, index: 0} -} -func (d jwsSignatureNode) ListIterator() ipld.ListIterator { - return nil -} -func (d jwsSignatureNode) Length() int64 { - return int64(len((&jwsSignatureMapIterator{sig: d, index: 0}).presentKeys())) -} -func (d jwsSignatureNode) IsAbsent() bool { - return false -} -func (d jwsSignatureNode) IsNull() bool { - return false -} -func (d jwsSignatureNode) AsBool() (bool, error) { - return mixins.Map{TypeName: "dagjose.JOSESignature"}.AsBool() -} -func (d jwsSignatureNode) AsInt() (int64, error) { - return mixins.Map{TypeName: "dagjose.JOSESignature"}.AsInt() -} -func (d jwsSignatureNode) AsFloat() (float64, error) { - return mixins.Map{TypeName: "dagjose.JOSESignature"}.AsFloat() -} -func (d jwsSignatureNode) AsString() (string, error) { - return mixins.Map{TypeName: "dagjose.JOSESignature"}.AsString() -} -func (d jwsSignatureNode) AsBytes() ([]byte, error) { - return mixins.Map{TypeName: "dagjose.JOSESignature"}.AsBytes() -} -func (d jwsSignatureNode) AsLink() (ipld.Link, error) { - return mixins.Map{TypeName: "dagjose.JOSESignature"}.AsLink() -} -func (d jwsSignatureNode) Prototype() ipld.NodePrototype { - return nil -} - -// end JOSESignature ipld.Node implementation - -type jwsSignatureMapIterator struct { - sig jwsSignatureNode - index int -} - -func (j *jwsSignatureMapIterator) Next() (key ipld.Node, value ipld.Node, err error) { - if j.Done() { - return nil, nil, ipld.ErrIteratorOverread{} - } - keys := j.presentKeys() - keyString := keys[j.index] - value, _ = j.sig.LookupByString(keyString) - j.index += 1 - return basicnode.NewString(keyString), value, nil -} - -func (j *jwsSignatureMapIterator) presentKeys() []string { - result := []string{"signature"} - if j.sig.protected != nil { - result = append(result, "protected") - } - if j.sig.header != nil { - result = append(result, "header") - } - return result -} - -func (j *jwsSignatureMapIterator) Done() bool { - return j.index >= len(j.presentKeys()) -} diff --git a/dagjose/multicodec.go b/dagjose/multicodec.go index d5f6e94..3ae0894 100644 --- a/dagjose/multicodec.go +++ b/dagjose/multicodec.go @@ -1,11 +1,119 @@ package dagjose +//go:generate go run ./gen . +//go:generate go fmt ./ + import ( - dagcbor "github.com/ipld/go-ipld-prime/codec/dagcbor" - multicodec "github.com/ipld/go-ipld-prime/multicodec" + "errors" + "io" + + "github.com/ipfs/go-cid" + "github.com/ipld/go-ipld-prime/codec" + "github.com/ipld/go-ipld-prime/codec/dagcbor" + "github.com/ipld/go-ipld-prime/datamodel" + "github.com/ipld/go-ipld-prime/linking/cid" + "github.com/ipld/go-ipld-prime/multicodec" + "github.com/ipld/go-ipld-prime/schema" + "github.com/multiformats/go-multibase" ) func init() { - multicodec.RegisterDecoder(0x85, dagcbor.Decode) - multicodec.RegisterEncoder(0x85, dagcbor.Encode) + multicodec.RegisterDecoder(0x85, Decode) + multicodec.RegisterEncoder(0x85, Encode) +} + +// Decode deserializes data from the given io.Reader and feeds it into the given datamodel.NodeAssembler. Decode fits +// the codec.Decoder function interface. +func Decode(na datamodel.NodeAssembler, r io.Reader) error { + // If the passed `NodeAssembler` is not of type `_DecodedJOSE__ReprBuilder`, create and use a + // `_DecodedJOSE__ReprBuilder`. + joseBuilder, alreadyJose := na.(*_DecodedJOSE__ReprBuilder) + if !alreadyJose { + joseBuilder = Type.DecodedJOSE__Repr.NewBuilder().(*_DecodedJOSE__ReprBuilder) + } + // DAG-CBOR is a superset of DAG-JOSE and can be used to decode valid DAG-JOSE objects. Use DAG-CBOR decoding but do + // not allow IPLD Links. See: https://specs.ipld.io/block-layer/codecs/dag-jose.html + err := dagcbor.DecodeOptions{ + AllowLinks: false, + }.Decode(joseBuilder, r) + if err != nil { + return err + } + // If `payload` is present but `link` is not, add `link` with the corresponding encoded CID. + payloadNode := &joseBuilder.w.payload + linkNode := &joseBuilder.w.link + if payloadNode.Exists() && !linkNode.Exists() { + if link, err := Type.Base64Url.Link(&payloadNode.v); err != nil { + return err + } else { + linkNode.m = schema.Maybe_Value + linkNode.v = *link + } + } + // The "representation" node gives an accurate view of fields that are actually present + joseNode := joseBuilder.Build().(schema.TypedNode).Representation() + // If the passed `NodeAssembler` is not of type `_DecodedJOSE__ReprBuilder`, copy the constructed + // `_DecodedJOSE__Repr` into the caller's `NodeAssembler`. + if !alreadyJose { + return datamodel.Copy(joseNode, na) + } + return nil +} + +// Encode walks the given datamodel.Node and serializes it to the given io.Writer. Encode fits the codec.Encoder +// function interface. +func Encode(n datamodel.Node, w io.Writer) error { + rebuildRequired := false + // If `link` and `payload` are present, make sure they match. + if linkNode, err := n.LookupByString("link"); err != nil { + // It's ok for `link` to be absent (even if `payload` was present), but if some other error occurred, + // return it. + if _, linkNotFound := err.(datamodel.ErrNotExists); !linkNotFound { + return err + } + } else { + // If `link` was present then `payload` must be present and the two must match. If any error occurs here + // (including `payload` being absent) return it. + payloadNode, err := n.LookupByString("payload") + if err != nil { + return err + } + payloadString, err := payloadNode.AsString() + if err != nil { + return err + } + cidFromPayload, err := cid.Decode(string(multibase.Base64url) + payloadString) + if err != nil { + return err + } + linkFromNode, err := linkNode.AsLink() + if err != nil { + return err + } + if linkFromNode.(cidlink.Link).Cid != cidFromPayload { + return errors.New("cid mismatch") + } + // The node needs to be rebuilt without `link` before it can be encoded + rebuildRequired = true + } + // If the passed `Node` is not of type `_EncodedJOSE__Repr`, convert it to `_EncodedJOSE__Repr`. + if _, alreadyJose := n.(*_EncodedJOSE__Repr); !alreadyJose || rebuildRequired { + joseBuilder := Type.EncodedJOSE__Repr.NewBuilder().(*_EncodedJOSE__ReprBuilder) + // Copy the passed `Node` into `_EncodedJOSE__ReprBuilder`, which applies all the necessary validations required + // to construct a `_EncodedJOSE__Repr` node. + if err := datamodel.Copy(n, joseBuilder); err != nil { + return err + } + // Mark `link` as absent because we do not want to encode it + joseBuilder.w.link.m = schema.Maybe_Absent + joseBuilder.w.link.v.x = nil + // The "representation" node gives an accurate view of fields that are actually present + n = joseBuilder.Build().(schema.TypedNode).Representation() + } + // DAG-CBOR is a superset of DAG-JOSE and can be used to encode valid DAG-JOSE objects. Use DAG-CBOR's Map sorting + // but do not allow IPLD Links. See: https://specs.ipld.io/block-layer/codecs/dag-jose.html + return dagcbor.EncodeOptions{ + AllowLinks: false, + MapSortMode: codec.MapSortMode_RFC7049, + }.Encode(n, w) } diff --git a/go.mod b/go.mod index 391a49d..febf580 100644 --- a/go.mod +++ b/go.mod @@ -4,11 +4,11 @@ go 1.16 require ( github.com/ipfs/go-cid v0.0.7 - github.com/ipld/go-ipld-prime v0.12.0 + github.com/ipld/go-ipld-prime v0.12.4-0.20211104190200-228843ba1d5d + github.com/multiformats/go-multibase v0.0.3 // indirect github.com/multiformats/go-multihash v0.0.15 github.com/stretchr/testify v1.6.1 golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect gopkg.in/square/go-jose.v2 v2.5.1 - pgregory.net/rapid v0.4.1 + pgregory.net/rapid v0.4.7 ) diff --git a/go.sum b/go.sum index c44e32a..7ca41a9 100644 --- a/go.sum +++ b/go.sum @@ -1,24 +1,28 @@ +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= +github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M= github.com/ipfs/go-cid v0.0.7 h1:ysQJVJA3fNDF1qigJbsSQOdjhVLsOEoPdh0+R97k3jY= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipld/go-ipld-prime v0.9.0 h1:N2OjJMb+fhyFPwPnVvJcWU/NsumP8etal+d2v3G4eww= -github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= -github.com/ipld/go-ipld-prime v0.12.0 h1:JapyKWTsJgmhrPI7hfx4V798c/RClr85sXfBZnH1VIw= -github.com/ipld/go-ipld-prime v0.12.0/go.mod h1:hy8b93WleDMRKumOJnTIrr0MbbFbx9GD6Kzxa53Xppc= +github.com/ipld/go-ipld-prime v0.12.4-0.20211104190200-228843ba1d5d h1:Z2tfRXtKWthzeRYxH7kjj8dJQq/DUoAyP24vuHdUSTg= +github.com/ipld/go-ipld-prime v0.12.4-0.20211104190200-228843ba1d5d/go.mod h1:JUI6cS52J83Tz5li0Zl6M2tDX4r5x68Y77K1fbXHFYo= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QHbiw= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= @@ -36,6 +40,8 @@ github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoR github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= +github.com/multiformats/go-multicodec v0.3.0 h1:tstDwfIjiHbnIjeM5Lp+pMrSeN+LCMsEwOrkPmWm03A= +github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.15 h1:hWOPdrNqDjwHDx82vsYGSDZNyktOJJ2dzZJzFkOV1jM= @@ -45,10 +51,10 @@ github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2 github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1 h1:CskT+S6Ay54OwxBGB0R3Rsx4Muto6UnEYTyKJbyRIAI= -github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e h1:ZOcivgkkFRnjfoTcGsDq3UQYiBmekwLA+qg0OjyB/ls= github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= @@ -74,14 +80,17 @@ golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -pgregory.net/rapid v0.4.1 h1:oC9zGwnIaJvtkyj7yAFD1SX+BkQx0ghSmn85zzK/1sQ= -pgregory.net/rapid v0.4.1/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= +pgregory.net/rapid v0.4.7 h1:MTNRktPuv5FNqOO151TM9mDTa+XHcX6ypYeISDVD14g= +pgregory.net/rapid v0.4.7/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU=