cuelang.org/go@v0.10.1/pkg/path/pkg.go (about)

     1  // Copyright 2020 CUE Authors
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package path
    16  
    17  import (
    18  	"cuelang.org/go/internal/core/adt"
    19  	"cuelang.org/go/internal/pkg"
    20  )
    21  
    22  func init() {
    23  	pkg.Register("path", p)
    24  }
    25  
    26  var _ = adt.TopKind // in case the adt package isn't used
    27  
    28  var (
    29  	osRequired = &adt.Disjunction{
    30  		Values: allOS,
    31  	}
    32  
    33  	unixDefault = &adt.Disjunction{
    34  		NumDefaults: 1,
    35  		Values:      allOS,
    36  	}
    37  
    38  	// windowsDefault is the default for VolumeName.
    39  	windowsDefault = &adt.Disjunction{
    40  		NumDefaults: 1,
    41  		Values: append([]adt.Value{
    42  			newStr("windows"),
    43  			newStr("unix"),
    44  			newStr("plan9")}, unixOS...),
    45  	}
    46  
    47  	allOS = append([]adt.Value{
    48  		newStr("unix"),
    49  		newStr("windows"),
    50  		newStr("plan9"),
    51  	}, unixOS...)
    52  
    53  	// These all fall back to unix
    54  	unixOS = []adt.Value{
    55  		newStr("aix"),
    56  		newStr("android"),
    57  		newStr("darwin"),
    58  		newStr("dragonfly"),
    59  		newStr("freebsd"),
    60  		newStr("hurd"),
    61  		newStr("illumos"),
    62  		newStr("ios"),
    63  		newStr("js"),
    64  		newStr("linux"),
    65  		newStr("nacl"),
    66  		newStr("netbsd"),
    67  		newStr("openbsd"),
    68  		newStr("solaris"),
    69  		newStr("zos"),
    70  	}
    71  )
    72  
    73  func newStr(s string) adt.Value {
    74  	return &adt.String{Str: s}
    75  }
    76  
    77  var p = &pkg.Package{
    78  	CUE: `{
    79  		Unix:    "unix"
    80  		Windows: "windows"
    81  		Plan9:   "plan9"
    82  	}`,
    83  	Native: []*pkg.Builtin{{
    84  		Name: "Split",
    85  		Params: []pkg.Param{
    86  			{Kind: adt.StringKind},
    87  			{Kind: adt.StringKind, Value: unixDefault},
    88  		},
    89  		Result: adt.ListKind,
    90  		Func: func(c *pkg.CallCtxt) {
    91  			path, os := c.String(0), c.String(1)
    92  			if c.Do() {
    93  				c.Ret = Split(path, OS(os))
    94  			}
    95  		},
    96  	}, {
    97  		Name: "SplitList",
    98  		Params: []pkg.Param{
    99  			{Kind: adt.StringKind},
   100  			{Kind: adt.StringKind, Value: osRequired},
   101  		},
   102  		Result: adt.ListKind,
   103  		Func: func(c *pkg.CallCtxt) {
   104  			path, os := c.String(0), c.String(1)
   105  			if c.Do() {
   106  				c.Ret = SplitList(path, OS(os))
   107  			}
   108  		},
   109  	}, {
   110  		Name: "Join",
   111  		Params: []pkg.Param{
   112  			{Kind: adt.ListKind},
   113  			{Kind: adt.StringKind, Value: unixDefault},
   114  		},
   115  		Result: adt.StringKind,
   116  		Func: func(c *pkg.CallCtxt) {
   117  			list, os := c.StringList(0), c.String(1)
   118  			if c.Do() {
   119  				c.Ret = Join(list, OS(os))
   120  			}
   121  		},
   122  	}, {
   123  		Name: "Match",
   124  		Params: []pkg.Param{
   125  			{Kind: adt.StringKind},
   126  			{Kind: adt.StringKind},
   127  			{Kind: adt.StringKind, Value: unixDefault},
   128  		},
   129  		Result: adt.BoolKind,
   130  		Func: func(c *pkg.CallCtxt) {
   131  			pattern, name, os := c.String(0), c.String(1), c.String(2)
   132  			if c.Do() {
   133  				c.Ret, c.Err = Match(pattern, name, OS(os))
   134  			}
   135  		},
   136  	}, {
   137  		Name: "Clean",
   138  		Params: []pkg.Param{
   139  			{Kind: adt.StringKind},
   140  			{Kind: adt.StringKind, Value: unixDefault},
   141  		},
   142  		Result: adt.StringKind,
   143  		Func: func(c *pkg.CallCtxt) {
   144  			path, os := c.String(0), c.String(1)
   145  			if c.Do() {
   146  				c.Ret = Clean(path, OS(os))
   147  			}
   148  		},
   149  	}, {
   150  		Name: "ToSlash",
   151  		Params: []pkg.Param{
   152  			{Kind: adt.StringKind},
   153  			{Kind: adt.StringKind, Value: osRequired},
   154  		},
   155  		Result: adt.StringKind,
   156  		Func: func(c *pkg.CallCtxt) {
   157  			path, os := c.String(0), c.String(1)
   158  			if c.Do() {
   159  				c.Ret = ToSlash(path, OS(os))
   160  			}
   161  		},
   162  	}, {
   163  		Name: "FromSlash",
   164  		Params: []pkg.Param{
   165  			{Kind: adt.StringKind},
   166  			{Kind: adt.StringKind, Value: osRequired},
   167  		},
   168  		Result: adt.StringKind,
   169  		Func: func(c *pkg.CallCtxt) {
   170  			path, os := c.String(0), c.String(1)
   171  			if c.Do() {
   172  				c.Ret = FromSlash(path, OS(os))
   173  			}
   174  		},
   175  	}, {
   176  		Name: "Ext",
   177  		Params: []pkg.Param{
   178  			{Kind: adt.StringKind},
   179  			{Kind: adt.StringKind, Value: unixDefault},
   180  		},
   181  		Result: adt.StringKind,
   182  		Func: func(c *pkg.CallCtxt) {
   183  			path, os := c.String(0), c.String(1)
   184  			if c.Do() {
   185  				c.Ret = Ext(path, OS(os))
   186  			}
   187  		},
   188  	}, {
   189  		Name: "Resolve",
   190  		Params: []pkg.Param{
   191  			{Kind: adt.StringKind},
   192  			{Kind: adt.StringKind},
   193  			{Kind: adt.StringKind, Value: unixDefault},
   194  		},
   195  		Result: adt.StringKind,
   196  		Func: func(c *pkg.CallCtxt) {
   197  			dir, sub, os := c.String(0), c.String(1), c.String(2)
   198  			if c.Do() {
   199  				c.Ret = Resolve(dir, sub, OS(os))
   200  			}
   201  		},
   202  	}, {
   203  		Name: "Rel",
   204  		Params: []pkg.Param{
   205  			{Kind: adt.StringKind},
   206  			{Kind: adt.StringKind},
   207  			{Kind: adt.StringKind, Value: unixDefault},
   208  		},
   209  		Result: adt.StringKind,
   210  		Func: func(c *pkg.CallCtxt) {
   211  			base, target, os := c.String(0), c.String(1), c.String(2)
   212  			if c.Do() {
   213  				c.Ret, c.Err = Rel(base, target, OS(os))
   214  			}
   215  		},
   216  	}, {
   217  		Name: "Base",
   218  		Params: []pkg.Param{
   219  			{Kind: adt.StringKind},
   220  			{Kind: adt.StringKind, Value: unixDefault},
   221  		},
   222  		Result: adt.StringKind,
   223  		Func: func(c *pkg.CallCtxt) {
   224  			path, os := c.String(0), c.String(1)
   225  			if c.Do() {
   226  				c.Ret = Base(path, OS(os))
   227  			}
   228  		},
   229  	}, {
   230  		Name: "Dir",
   231  		Params: []pkg.Param{
   232  			{Kind: adt.StringKind},
   233  			{Kind: adt.StringKind, Value: unixDefault},
   234  		},
   235  		Result: adt.StringKind,
   236  		Func: func(c *pkg.CallCtxt) {
   237  			path, os := c.String(0), c.String(1)
   238  			if c.Do() {
   239  				c.Ret = Dir(path, OS(os))
   240  			}
   241  		},
   242  	}, {
   243  		Name: "IsAbs",
   244  		Params: []pkg.Param{
   245  			{Kind: adt.StringKind},
   246  			{Kind: adt.StringKind, Value: unixDefault},
   247  		},
   248  		Result: adt.BoolKind,
   249  		Func: func(c *pkg.CallCtxt) {
   250  			path, os := c.String(0), c.String(1)
   251  			if c.Do() {
   252  				c.Ret = IsAbs(path, OS(os))
   253  			}
   254  		},
   255  	}, {
   256  		Name: "VolumeName",
   257  		Params: []pkg.Param{
   258  			{Kind: adt.StringKind},
   259  			{Kind: adt.StringKind, Value: windowsDefault},
   260  		},
   261  		Result: adt.StringKind,
   262  		Func: func(c *pkg.CallCtxt) {
   263  			path, os := c.String(0), c.String(1)
   264  			if c.Do() {
   265  				c.Ret = VolumeName(path, OS(os))
   266  			}
   267  		},
   268  	}},
   269  }