mirror of
https://github.com/gomods/athens
synced 2026-02-10 08:48:11 +00:00
53 lines
992 B
Go
53 lines
992 B
Go
package paths
|
|
|
|
import (
|
|
"fmt"
|
|
"unicode/utf8"
|
|
|
|
"github.com/gomods/athens/pkg/errors"
|
|
)
|
|
|
|
// DecodePath returns the module path of the given safe encoding.
|
|
// It fails if the encoding is invalid or encodes an invalid path.
|
|
func DecodePath(encoding string) (path string, err error) {
|
|
const op errors.Op = "paths.DecodePath"
|
|
path, ok := decodeString(encoding)
|
|
if !ok {
|
|
return "", errors.E(op, fmt.Sprintf("invalid module path encoding %q", encoding))
|
|
}
|
|
|
|
return path, nil
|
|
}
|
|
|
|
// Ripped from cmd/go
|
|
func decodeString(encoding string) (string, bool) {
|
|
var buf []byte
|
|
|
|
bang := false
|
|
for _, r := range encoding {
|
|
if r >= utf8.RuneSelf {
|
|
return "", false
|
|
}
|
|
if bang {
|
|
bang = false
|
|
if r < 'a' || 'z' < r {
|
|
return "", false
|
|
}
|
|
buf = append(buf, byte(r+'A'-'a'))
|
|
continue
|
|
}
|
|
if r == '!' {
|
|
bang = true
|
|
continue
|
|
}
|
|
if 'A' <= r && r <= 'Z' {
|
|
return "", false
|
|
}
|
|
buf = append(buf, byte(r))
|
|
}
|
|
if bang {
|
|
return "", false
|
|
}
|
|
return string(buf), true
|
|
}
|