cue: expose some path utilities
1) allow generating a Selector from an ast.Label
2) allow directly querying whether a Selector is a string or not.
Change-Id: I89a99a8a776949de9f31b1b2b0438578018f4860
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/9241
Reviewed-by: CUE cueckoo <cueckoo@gmail.com>
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/cue/path.go b/cue/path.go
index 21f48f0..9a5074d 100644
--- a/cue/path.go
+++ b/cue/path.go
@@ -39,6 +39,11 @@
return sel.sel.String()
}
+// IsString reports whether sel is a regular label type.
+func (sel Selector) IsString() bool {
+ return sel.sel.kind() == adt.StringLabel
+}
+
type selector interface {
String() string
@@ -116,7 +121,7 @@
func toSelectors(expr ast.Expr) []Selector {
switch x := expr.(type) {
case *ast.Ident:
- return []Selector{identSelector(x)}
+ return []Selector{Label(x)}
case *ast.BasicLit:
return []Selector{basicLitSelector(x)}
@@ -135,7 +140,7 @@
case *ast.SelectorExpr:
a := toSelectors(x.X)
- return appendSelector(a, identSelector(x.Sel))
+ return appendSelector(a, Label(x.Sel))
default:
return []Selector{{pathError{
@@ -197,7 +202,8 @@
}
}
-func identSelector(label ast.Label) Selector {
+// Label converts an AST label to a Selector.
+func Label(label ast.Label) Selector {
switch x := label.(type) {
case *ast.Ident:
switch s := x.Name; {