github.com/joomcode/cue@v0.4.4-0.20221111115225-539fe3512047/cue/load/package.go (about) 1 // Copyright 2018 The 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 load 16 17 import ( 18 "unicode/utf8" 19 ) 20 21 // Package rules: 22 // 23 // - the package clause defines a namespace. 24 // - a cue file without a package clause is a standalone file. 25 // - all files with the same package name within a directory and its 26 // ancestor directories up to the package root belong to the same package. 27 // - The package root is either the top of the file hierarchy or the first 28 // directory in which a cue.mod file is defined. 29 // 30 // The contents of a namespace depends on the directory that is selected as the 31 // starting point to load a package. An instance defines a package-directory 32 // pair. 33 34 // safeArg reports whether arg is a "safe" command-line argument, 35 // meaning that when it appears in a command-line, it probably 36 // doesn't have some special meaning other than its own name. 37 // Obviously args beginning with - are not safe (they look like flags). 38 // Less obviously, args beginning with @ are not safe (they look like 39 // GNU binutils flagfile specifiers, sometimes called "response files"). 40 // To be conservative, we reject almost any arg beginning with non-alphanumeric ASCII. 41 // We accept leading . _ and / as likely in file system paths. 42 // There is a copy of this function in cmd/compile/internal/gc/noder.go. 43 func safeArg(name string) bool { 44 if name == "" { 45 return false 46 } 47 c := name[0] 48 return '0' <= c && c <= '9' || 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || c == '.' || c == '_' || c == '/' || c >= utf8.RuneSelf 49 }