// Code generated by go generate. DO NOT EDIT.

//go:generate rm pkg.go
//go:generate go run ../../gen/gen.go

package json

import (
	"cuelang.org/go/internal/core/adt"
	"cuelang.org/go/pkg/internal"
)

func init() {
	internal.Register("encoding/json", pkg)
}

var _ = adt.TopKind // in case the adt package isn't used

var pkg = &internal.Package{
	Native: []*internal.Builtin{{
		Name:   "Valid",
		Params: []adt.Kind{adt.BytesKind | adt.StringKind},
		Result: adt.BoolKind,
		Func: func(c *internal.CallCtxt) {
			data := c.Bytes(0)
			if c.Do() {
				c.Ret = Valid(data)
			}
		},
	}, {
		Name:   "Compact",
		Params: []adt.Kind{adt.BytesKind | adt.StringKind},
		Result: adt.StringKind,
		Func: func(c *internal.CallCtxt) {
			src := c.Bytes(0)
			if c.Do() {
				c.Ret, c.Err = Compact(src)
			}
		},
	}, {
		Name:   "Indent",
		Params: []adt.Kind{adt.BytesKind | adt.StringKind, adt.StringKind, adt.StringKind},
		Result: adt.StringKind,
		Func: func(c *internal.CallCtxt) {
			src, prefix, indent := c.Bytes(0), c.String(1), c.String(2)
			if c.Do() {
				c.Ret, c.Err = Indent(src, prefix, indent)
			}
		},
	}, {
		Name:   "HTMLEscape",
		Params: []adt.Kind{adt.BytesKind | adt.StringKind},
		Result: adt.StringKind,
		Func: func(c *internal.CallCtxt) {
			src := c.Bytes(0)
			if c.Do() {
				c.Ret = HTMLEscape(src)
			}
		},
	}, {
		Name:   "Marshal",
		Params: []adt.Kind{adt.TopKind},
		Result: adt.StringKind,
		Func: func(c *internal.CallCtxt) {
			v := c.Value(0)
			if c.Do() {
				c.Ret, c.Err = Marshal(v)
			}
		},
	}, {
		Name:   "MarshalStream",
		Params: []adt.Kind{adt.TopKind},
		Result: adt.StringKind,
		Func: func(c *internal.CallCtxt) {
			v := c.Value(0)
			if c.Do() {
				c.Ret, c.Err = MarshalStream(v)
			}
		},
	}, {
		Name:   "Unmarshal",
		Params: []adt.Kind{adt.BytesKind | adt.StringKind},
		Result: adt.TopKind,
		Func: func(c *internal.CallCtxt) {
			b := c.Bytes(0)
			if c.Do() {
				c.Ret, c.Err = Unmarshal(b)
			}
		},
	}, {
		Name:   "Validate",
		Params: []adt.Kind{adt.BytesKind | adt.StringKind, adt.TopKind},
		Result: adt.BoolKind,
		Func: func(c *internal.CallCtxt) {
			b, v := c.Bytes(0), c.Value(1)
			if c.Do() {
				c.Ret, c.Err = Validate(b, v)
			}
		},
	}},
}
