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
15package path
16
17import (
18 "cuelang.org/go/internal/core/adt"
19 "cuelang.org/go/internal/pkg"
20)
21
22func init() {
23 pkg.Register("path", p)
24}
25
26var _ = adt.TopKind // in case the adt package isn't used
27
28var (
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
73func newStr(s string) adt.Value {
74 return &adt.String{Str: s}
75}
76
77var 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}