pkger/here/info.go

86 lines
1.7 KiB
Go
Raw Normal View History

2019-08-05 00:13:27 +03:00
package here
import (
"encoding/json"
"os"
"path/filepath"
"runtime"
"strings"
)
// Info represents details about the directory/package
type Info struct {
2019-10-09 20:21:54 +03:00
Dir string
ImportPath string
Name string
Module Module
2019-10-09 20:21:54 +03:00
}
// NewInfoFromPath initialize a Info with a basic information and his module
// this method could be used when the Unmarshal information is not possible
func NewInfoFromPath(path string, m Module) Info {
return Info{
Dir: path,
Module: m,
}
}
2019-11-10 13:56:09 +03:00
func (i Info) MarshalJSON() ([]byte, error) {
2019-10-09 20:21:54 +03:00
mm := map[string]interface{}{
2019-11-10 13:56:09 +03:00
"ImportPath": i.ImportPath,
"Name": i.Name,
"Module": i.Module,
"Dir": i.Dir,
}
2019-11-01 22:53:54 +03:00
return json.Marshal(mm)
2019-08-05 00:13:27 +03:00
}
func (i Info) FilePath(paths ...string) string {
res := []string{i.Dir}
for _, p := range paths {
p = strings.TrimPrefix(p, i.Dir)
p = strings.TrimPrefix(p, "/")
if runtime.GOOS == "windows" {
p = strings.Replace(p, "/", "\\", -1)
}
res = append(res, p)
}
return filepath.Join(res...)
}
func (i Info) Open(p string) (*os.File, error) {
return os.Open(i.FilePath(p))
}
// ModuleName returns the name of the current
// module, or if not using modules, the current
// package. These *might* not match.
func (i Info) ModuleName() string {
if i.Mods() {
return i.Module.Path
}
return i.ImportPath
}
// IsZero checks if the type has been filled
// with rich chocolately data goodness
func (i Info) IsZero() bool {
return i.String() == Info{}.String()
}
// Mods returns whether Go modules are used
// in this directory/package.
func (i Info) Mods() bool {
return !i.Module.IsZero()
}
func (i Info) String() string {
b, err := json.MarshalIndent(i, "", " ")
if err != nil {
return err.Error()
}
s := string(b)
return s
}