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

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

package path

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

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

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

var pkg = &internal.Package{
	Native: []*internal.Builtin{{
		Name: "Split",
		Params: []internal.Param{
			{Kind: adt.StringKind},
		},
		Result: adt.ListKind,
		Func: func(c *internal.CallCtxt) {
			path := c.String(0)
			if c.Do() {
				c.Ret = Split(path)
			}
		},
	}, {
		Name: "Match",
		Params: []internal.Param{
			{Kind: adt.StringKind},
			{Kind: adt.StringKind},
		},
		Result: adt.BoolKind,
		Func: func(c *internal.CallCtxt) {
			pattern, name := c.String(0), c.String(1)
			if c.Do() {
				c.Ret, c.Err = Match(pattern, name)
			}
		},
	}, {
		Name: "Clean",
		Params: []internal.Param{
			{Kind: adt.StringKind},
		},
		Result: adt.StringKind,
		Func: func(c *internal.CallCtxt) {
			path := c.String(0)
			if c.Do() {
				c.Ret = Clean(path)
			}
		},
	}, {
		Name: "Ext",
		Params: []internal.Param{
			{Kind: adt.StringKind},
		},
		Result: adt.StringKind,
		Func: func(c *internal.CallCtxt) {
			path := c.String(0)
			if c.Do() {
				c.Ret = Ext(path)
			}
		},
	}, {
		Name: "Base",
		Params: []internal.Param{
			{Kind: adt.StringKind},
		},
		Result: adt.StringKind,
		Func: func(c *internal.CallCtxt) {
			path := c.String(0)
			if c.Do() {
				c.Ret = Base(path)
			}
		},
	}, {
		Name: "IsAbs",
		Params: []internal.Param{
			{Kind: adt.StringKind},
		},
		Result: adt.BoolKind,
		Func: func(c *internal.CallCtxt) {
			path := c.String(0)
			if c.Do() {
				c.Ret = IsAbs(path)
			}
		},
	}, {
		Name: "Dir",
		Params: []internal.Param{
			{Kind: adt.StringKind},
		},
		Result: adt.StringKind,
		Func: func(c *internal.CallCtxt) {
			path := c.String(0)
			if c.Do() {
				c.Ret = Dir(path)
			}
		},
	}},
}
