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 }