-
Notifications
You must be signed in to change notification settings - Fork 9
/
fstypes.go
52 lines (42 loc) · 1.29 KB
/
fstypes.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// Copyright 2022 Namespace Labs Inc; All rights reserved.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
package fnfs
import (
"io/fs"
"path/filepath"
"strings"
"namespacelabs.dev/foundation/schema"
)
// Identifies a package/file within a module.
type Location struct {
ModuleName string
// FS rooted at the module [ModuleName] root.
FS fs.FS
// Path within the module (within [FS]).
RelPath string
}
func (loc Location) Rel(rel ...string) string {
return filepath.Join(append([]string{loc.RelPath}, rel...)...)
}
func (loc Location) String() string {
if loc.RelPath == "." {
return loc.ModuleName
}
return filepath.Join(loc.ModuleName, loc.RelPath)
}
func (loc Location) AsPackageName() schema.PackageName {
return schema.PackageName(loc.String())
}
// Implements the fnerrors.Location interface.
func (loc Location) ErrorLocation() string {
return loc.RelPath
}
func ResolveLocation(moduleName, packageName string) (Location, bool) {
if moduleName == packageName {
return Location{ModuleName: moduleName, RelPath: "."}, true
} else if x := strings.TrimPrefix(packageName, moduleName+"/"); x != packageName {
return Location{ModuleName: moduleName, RelPath: x}, true
}
return Location{}, false
}