// 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: []adt.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: []adt.Kind{adt.StringKind, 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: []adt.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: []adt.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: []adt.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: []adt.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: []adt.Kind{adt.StringKind},
		Result: adt.StringKind,
		Func: func(c *internal.CallCtxt) {
			path := c.String(0)
			if c.Do() {
				c.Ret = Dir(path)
			}
		},
	}},
}
