| // Copyright 2020 CUE Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package path |
| |
| // OS must be a valid runtime.GOOS value or "unix". |
| type OS string |
| |
| const ( |
| Unix OS = "unix" |
| Windows OS = "windows" |
| Plan9 OS = "plan9" |
| ) |
| |
| // These types have been designed to minimize the diffs with the original Go |
| // code, thereby minimizing potential toil in keeping them up to date. |
| |
| type os struct { |
| osInfo |
| Separator byte |
| ListSeparator byte |
| } |
| |
| func (o os) isWindows() bool { |
| return o.Separator == '\\' |
| } |
| |
| type osInfo interface { |
| IsPathSeparator(b byte) bool |
| splitList(path string) []string |
| volumeNameLen(path string) int |
| IsAbs(path string) (b bool) |
| HasPrefix(p, prefix string) bool |
| join(elem []string) string |
| sameWord(a, b string) bool |
| } |
| |
| func getOS(o OS) os { |
| switch o { |
| case Windows: |
| return windows |
| case Plan9: |
| return plan9 |
| default: |
| return unix |
| } |
| } |
| |
| var ( |
| plan9 = os{ |
| osInfo: &plan9Info{}, |
| Separator: plan9Separator, |
| ListSeparator: plan9ListSeparator, |
| } |
| unix = os{ |
| osInfo: &unixInfo{}, |
| Separator: unixSeparator, |
| ListSeparator: unixListSeparator, |
| } |
| windows = os{ |
| osInfo: &windowsInfo{}, |
| Separator: windowsSeparator, |
| ListSeparator: windowsListSeparator, |
| } |
| ) |