| // Copyright 2018 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package source |
| |
| import ( |
| "fmt" |
| "net/url" |
| "path/filepath" |
| "runtime" |
| "strings" |
| ) |
| |
| const fileSchemePrefix = "file://" |
| |
| // URI represents the full uri for a file. |
| type URI string |
| |
| // Filename gets the file path for the URI. |
| // It will return an error if the uri is not valid, or if the URI was not |
| // a file URI |
| func (uri URI) Filename() (string, error) { |
| s := string(uri) |
| if !strings.HasPrefix(s, fileSchemePrefix) { |
| return "", fmt.Errorf("only file URI's are supported, got %v", uri) |
| } |
| s = s[len(fileSchemePrefix):] |
| s, err := url.PathUnescape(s) |
| if err != nil { |
| return s, err |
| } |
| s = filepath.FromSlash(s) |
| return s, nil |
| } |
| |
| // ToURI returns a protocol URI for the supplied path. |
| // It will always have the file scheme. |
| func ToURI(path string) URI { |
| const prefix = "$GOROOT" |
| if strings.EqualFold(prefix, path[:len(prefix)]) { |
| suffix := path[len(prefix):] |
| //TODO: we need a better way to get the GOROOT that uses the packages api |
| path = runtime.GOROOT() + suffix |
| } |
| return URI(fileSchemePrefix + filepath.ToSlash(path)) |
| } |