// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT.

package dagspliter

import (
	"fmt"
	"io"

	cid "github.com/ipfs/go-cid"
	cbg "github.com/whyrusleeping/cbor-gen"
	xerrors "golang.org/x/xerrors"
)

var _ = xerrors.Errorf

func (t *Box) MarshalCBOR(w io.Writer) error {
	if t == nil {
		_, err := w.Write(cbg.CborNull)
		return err
	}
	if _, err := w.Write([]byte{162}); err != nil {
		return err
	}

	scratch := make([]byte, 9)

	// t.Roots ([]cid.Cid) (slice)
	if len("Roots") > cbg.MaxLength {
		return xerrors.Errorf("Value in field \"Roots\" was too long")
	}

	if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("Roots"))); err != nil {
		return err
	}
	if _, err := io.WriteString(w, string("Roots")); err != nil {
		return err
	}

	if len(t.Roots) > cbg.MaxLength {
		return xerrors.Errorf("Slice value in field t.Roots was too long")
	}

	if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Roots))); err != nil {
		return err
	}
	for _, v := range t.Roots {
		if err := cbg.WriteCidBuf(scratch, w, v); err != nil {
			return xerrors.Errorf("failed writing cid field t.Roots: %w", err)
		}
	}

	// t.External ([]cid.Cid) (slice)
	if len("External") > cbg.MaxLength {
		return xerrors.Errorf("Value in field \"External\" was too long")
	}

	if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("External"))); err != nil {
		return err
	}
	if _, err := io.WriteString(w, string("External")); err != nil {
		return err
	}

	if len(t.External) > cbg.MaxLength {
		return xerrors.Errorf("Slice value in field t.External was too long")
	}

	if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.External))); err != nil {
		return err
	}
	for _, v := range t.External {
		if err := cbg.WriteCidBuf(scratch, w, v); err != nil {
			return xerrors.Errorf("failed writing cid field t.External: %w", err)
		}
	}
	return nil
}

func (t *Box) UnmarshalCBOR(r io.Reader) error {
	*t = Box{}

	br := cbg.GetPeeker(r)
	scratch := make([]byte, 8)

	maj, extra, err := cbg.CborReadHeaderBuf(br, scratch)
	if err != nil {
		return err
	}
	if maj != cbg.MajMap {
		return fmt.Errorf("cbor input should be of type map")
	}

	if extra > cbg.MaxLength {
		return fmt.Errorf("Box: map struct too large (%d)", extra)
	}

	var name string
	n := extra

	for i := uint64(0); i < n; i++ {

		{
			sval, err := cbg.ReadStringBuf(br, scratch)
			if err != nil {
				return err
			}

			name = string(sval)
		}

		switch name {
		// t.Roots ([]cid.Cid) (slice)
		case "Roots":

			maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
			if err != nil {
				return err
			}

			if extra > cbg.MaxLength {
				return fmt.Errorf("t.Roots: array too large (%d)", extra)
			}

			if maj != cbg.MajArray {
				return fmt.Errorf("expected cbor array")
			}

			if extra > 0 {
				t.Roots = make([]cid.Cid, extra)
			}

			for i := 0; i < int(extra); i++ {

				c, err := cbg.ReadCid(br)
				if err != nil {
					return xerrors.Errorf("reading cid field t.Roots failed: %w", err)
				}
				t.Roots[i] = c
			}

			// t.External ([]cid.Cid) (slice)
		case "External":

			maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
			if err != nil {
				return err
			}

			if extra > cbg.MaxLength {
				return fmt.Errorf("t.External: array too large (%d)", extra)
			}

			if maj != cbg.MajArray {
				return fmt.Errorf("expected cbor array")
			}

			if extra > 0 {
				t.External = make([]cid.Cid, extra)
			}

			for i := 0; i < int(extra); i++ {

				c, err := cbg.ReadCid(br)
				if err != nil {
					return xerrors.Errorf("reading cid field t.External failed: %w", err)
				}
				t.External[i] = c
			}

		default:
			return fmt.Errorf("unknown struct field %d: '%s'", i, name)
		}
	}

	return nil
}
