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

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

package structs

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

func init() {
	internal.Register("struct", pkg)
}

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

var pkg = &internal.Package{
	Native: []*internal.Builtin{{
		Name: "MinFields",
		Params: []internal.Param{
			{Kind: adt.StructKind},
			{Kind: adt.IntKind},
		},
		Result: adt.BottomKind,
		Func: func(c *internal.CallCtxt) {
			object, n := c.Struct(0), c.Int(1)
			if c.Do() {
				c.Ret = MinFields(object, n)
			}
		},
	}, {
		Name: "MaxFields",
		Params: []internal.Param{
			{Kind: adt.StructKind},
			{Kind: adt.IntKind},
		},
		Result: adt.BoolKind,
		Func: func(c *internal.CallCtxt) {
			object, n := c.Struct(0), c.Int(1)
			if c.Do() {
				c.Ret, c.Err = MaxFields(object, n)
			}
		},
	}},
}
