Initial golang implementation by-the-docs
This commit is contained in:
parent
73d7493c5d
commit
ed20d843c2
|
@ -17,7 +17,7 @@ func Cache() (string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func Config() (string, error) {
|
func Config() (string, error) {
|
||||||
dir, err := os.UserCacheDir()
|
dir, err := os.UserConfigDir()
|
||||||
return dir, err
|
return dir, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
2
go.mod
2
go.mod
|
@ -1,3 +1,5 @@
|
||||||
module git.martyn.berlin/martyn/golang-directories
|
module git.martyn.berlin/martyn/golang-directories
|
||||||
|
|
||||||
go 1.17
|
go 1.17
|
||||||
|
|
||||||
|
require golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=
|
||||||
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
@ -0,0 +1,59 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"git.martyn.berlin/martyn/golang-directories/base"
|
||||||
|
"git.martyn.berlin/martyn/golang-directories/project"
|
||||||
|
"git.martyn.berlin/martyn/golang-directories/user"
|
||||||
|
)
|
||||||
|
|
||||||
|
func GetFunctionName(i interface{}) string {
|
||||||
|
fullName := strings.Split(runtime.FuncForPC(reflect.ValueOf(i).Pointer()).Name(), "/")
|
||||||
|
funcName := fullName[len(fullName)-1]
|
||||||
|
return funcName
|
||||||
|
}
|
||||||
|
|
||||||
|
func printOne(f func() (string, error)) {
|
||||||
|
result, e := f()
|
||||||
|
if e != nil {
|
||||||
|
fmt.Printf("%s() : ERROR : %s\n", GetFunctionName(f), e.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Printf("%s() : %s\n", GetFunctionName(f), result)
|
||||||
|
}
|
||||||
|
|
||||||
|
func printall() {
|
||||||
|
printOne(base.Home)
|
||||||
|
printOne(base.Cache)
|
||||||
|
printOne(base.Config)
|
||||||
|
printOne(base.Data)
|
||||||
|
printOne(base.DataLocal)
|
||||||
|
printOne(base.Executable)
|
||||||
|
printOne(base.Preferences)
|
||||||
|
printOne(base.Runtime)
|
||||||
|
printOne(base.State)
|
||||||
|
printOne(user.Home)
|
||||||
|
printOne(user.Audio)
|
||||||
|
printOne(user.Desktop)
|
||||||
|
printOne(user.Documents)
|
||||||
|
printOne(user.Downloads)
|
||||||
|
printOne(user.Fonts)
|
||||||
|
printOne(user.Pictures)
|
||||||
|
printOne(user.Public)
|
||||||
|
printOne(user.Templates)
|
||||||
|
printOne(user.Videos)
|
||||||
|
project.SetProjectName("example", "org.example.example", "Example Corp.", "Example App")
|
||||||
|
printOne(project.Cache)
|
||||||
|
printOne(project.Config)
|
||||||
|
printOne(project.Data)
|
||||||
|
printOne(project.DataLocal)
|
||||||
|
printOne(project.Preferences)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
printall()
|
||||||
|
}
|
|
@ -0,0 +1,145 @@
|
||||||
|
package project
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"git.martyn.berlin/martyn/golang-directories/base"
|
||||||
|
)
|
||||||
|
|
||||||
|
var projectNameShort string
|
||||||
|
var projectNameReverse string
|
||||||
|
var projectNameOrg string
|
||||||
|
var projectNameProject string
|
||||||
|
|
||||||
|
// setProjectName sets the project name up and has the following components:
|
||||||
|
// short: a short name for the project, all lowercased
|
||||||
|
// reverse: a java-like reverse-domain-name style
|
||||||
|
// organisation: the name of the organisation which this project is under
|
||||||
|
// project: the "normal" project name
|
||||||
|
// example :
|
||||||
|
// setProjectName("notepad++","org.notepad-plus-plus.notepad-plus-plus","Don Ho","Notepad++")
|
||||||
|
// This is used for basing folder structures on.
|
||||||
|
func SetProjectName(short, reverse, organisation, project string) error {
|
||||||
|
projectNameShort = short
|
||||||
|
projectNameReverse = reverse
|
||||||
|
projectNameOrg = organisation
|
||||||
|
projectNameProject = project
|
||||||
|
if len(projectNameShort) < 1 || len(projectNameReverse) < 1 ||
|
||||||
|
len(projectNameProject) < 1 || len(projectNameProject) < 1 {
|
||||||
|
return errors.New("to use the directories/project package, you must call project.SetProjectName() with all four arguments set")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func projectPath() string {
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "linux":
|
||||||
|
return strings.ToLower(strings.ReplaceAll(projectNameShort, " ", "-"))
|
||||||
|
case "windows":
|
||||||
|
return projectNameOrg + "\\" + projectNameProject
|
||||||
|
case "darwin":
|
||||||
|
return projectNameReverse
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func Cache() (string, error) {
|
||||||
|
if len(projectNameShort) < 1 || len(projectNameReverse) < 1 ||
|
||||||
|
len(projectNameProject) < 1 || len(projectNameProject) < 1 {
|
||||||
|
return "", errors.New("to use the directories/project package, you must call project.SetProjectName() with all four arguments set")
|
||||||
|
}
|
||||||
|
c, e := base.Cache()
|
||||||
|
if e != nil {
|
||||||
|
return "", e
|
||||||
|
}
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "linux":
|
||||||
|
return c + "/" + projectPath(), nil
|
||||||
|
case "windows":
|
||||||
|
return c + "\\" + projectPath() + "\\cache", nil
|
||||||
|
case "darwin":
|
||||||
|
return c + "/" + projectPath(), nil
|
||||||
|
}
|
||||||
|
return "", errors.New("could not determine location for Cache()")
|
||||||
|
}
|
||||||
|
|
||||||
|
func Config() (string, error) {
|
||||||
|
if len(projectNameShort) < 1 || len(projectNameReverse) < 1 ||
|
||||||
|
len(projectNameProject) < 1 || len(projectNameProject) < 1 {
|
||||||
|
return "", errors.New("to use the directories/project package, you must call project.SetProjectName() with all four arguments set")
|
||||||
|
}
|
||||||
|
c, e := base.Config()
|
||||||
|
if e != nil {
|
||||||
|
return "", e
|
||||||
|
}
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "linux":
|
||||||
|
return c + "/" + projectPath(), nil
|
||||||
|
case "windows":
|
||||||
|
return c + "\\" + projectPath() + "\\config", nil
|
||||||
|
case "darwin":
|
||||||
|
return c + "/" + projectPath(), nil
|
||||||
|
}
|
||||||
|
return "", errors.New("could not determine location for Config()")
|
||||||
|
}
|
||||||
|
|
||||||
|
func Data() (string, error) {
|
||||||
|
if len(projectNameShort) < 1 || len(projectNameReverse) < 1 ||
|
||||||
|
len(projectNameProject) < 1 || len(projectNameProject) < 1 {
|
||||||
|
return "", errors.New("to use the directories/project package, you must call project.SetProjectName() with all four arguments set")
|
||||||
|
}
|
||||||
|
c, e := base.Data()
|
||||||
|
if e != nil {
|
||||||
|
return "", e
|
||||||
|
}
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "linux":
|
||||||
|
return c + "/" + projectPath(), nil
|
||||||
|
case "windows":
|
||||||
|
return c + "\\" + projectPath() + "\\data", nil
|
||||||
|
case "darwin":
|
||||||
|
return c + "/" + projectPath(), nil
|
||||||
|
}
|
||||||
|
return "", errors.New("could not determine location for Data()")
|
||||||
|
}
|
||||||
|
|
||||||
|
func DataLocal() (string, error) {
|
||||||
|
if len(projectNameShort) < 1 || len(projectNameReverse) < 1 ||
|
||||||
|
len(projectNameProject) < 1 || len(projectNameProject) < 1 {
|
||||||
|
return "", errors.New("to use the directories/project package, you must call project.SetProjectName() with all four arguments set")
|
||||||
|
}
|
||||||
|
c, e := base.DataLocal()
|
||||||
|
if e != nil {
|
||||||
|
return "", e
|
||||||
|
}
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "linux":
|
||||||
|
return c + "/" + projectPath(), nil
|
||||||
|
case "windows":
|
||||||
|
return c + "\\" + projectPath() + "\\data", nil
|
||||||
|
case "darwin":
|
||||||
|
return c + "/" + projectPath(), nil
|
||||||
|
}
|
||||||
|
return "", errors.New("could not determine location for DataLocal()")
|
||||||
|
}
|
||||||
|
func Preferences() (string, error) {
|
||||||
|
if len(projectNameShort) < 1 || len(projectNameReverse) < 1 ||
|
||||||
|
len(projectNameProject) < 1 || len(projectNameProject) < 1 {
|
||||||
|
return "", errors.New("to use the directories/project package, you must call project.SetProjectName() with all four arguments set")
|
||||||
|
}
|
||||||
|
c, e := base.Preferences()
|
||||||
|
if e != nil {
|
||||||
|
return "", e
|
||||||
|
}
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "linux":
|
||||||
|
return c + "/" + projectPath(), nil
|
||||||
|
case "windows":
|
||||||
|
return c + "\\" + projectPath() + "\\config", nil
|
||||||
|
case "darwin":
|
||||||
|
return c + "/" + projectPath(), nil
|
||||||
|
}
|
||||||
|
return "", errors.New("could not determine location for Preferences()")
|
||||||
|
}
|
|
@ -0,0 +1,170 @@
|
||||||
|
package user
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"os"
|
||||||
|
"runtime"
|
||||||
|
|
||||||
|
"golang.org/x/sys/windows"
|
||||||
|
|
||||||
|
"git.martyn.berlin/martyn/golang-directories/base"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Home() (string, error) {
|
||||||
|
return base.Home()
|
||||||
|
}
|
||||||
|
|
||||||
|
func Audio() (string, error) {
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "linux":
|
||||||
|
e, ok := os.LookupEnv("XDG_MUSIC_DIR")
|
||||||
|
if ok {
|
||||||
|
return e, nil
|
||||||
|
}
|
||||||
|
case "windows":
|
||||||
|
path, err := windows.KnownFolderPath(windows.FOLDERID_Music, 0)
|
||||||
|
return path, err
|
||||||
|
case "darwin":
|
||||||
|
h, err := Home()
|
||||||
|
return h + "/Music", err
|
||||||
|
}
|
||||||
|
return "", errors.New("could not determine location for Audio()")
|
||||||
|
}
|
||||||
|
|
||||||
|
func Desktop() (string, error) {
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "linux":
|
||||||
|
e, ok := os.LookupEnv("XDG_DESKTOP_DIR")
|
||||||
|
if ok {
|
||||||
|
return e, nil
|
||||||
|
}
|
||||||
|
case "windows":
|
||||||
|
path, err := windows.KnownFolderPath(windows.FOLDERID_Desktop, 0)
|
||||||
|
return path, err
|
||||||
|
case "darwin":
|
||||||
|
h, err := Home()
|
||||||
|
return h + "/Desktop", err
|
||||||
|
}
|
||||||
|
return "", errors.New("could not determine location for Desktop()")
|
||||||
|
}
|
||||||
|
|
||||||
|
func Documents() (string, error) {
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "linux":
|
||||||
|
e, ok := os.LookupEnv("XDG_DOCUMENTS_DIR")
|
||||||
|
if ok {
|
||||||
|
return e, nil
|
||||||
|
}
|
||||||
|
case "windows":
|
||||||
|
path, err := windows.KnownFolderPath(windows.FOLDERID_Documents, 0)
|
||||||
|
return path, err
|
||||||
|
case "darwin":
|
||||||
|
h, err := Home()
|
||||||
|
return h + "/Documents", err
|
||||||
|
}
|
||||||
|
return "", errors.New("could not determine location for Documents()")
|
||||||
|
}
|
||||||
|
|
||||||
|
func Downloads() (string, error) {
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "linux":
|
||||||
|
e, ok := os.LookupEnv("XDG_DOWNLOAD_DIR")
|
||||||
|
if ok {
|
||||||
|
return e, nil
|
||||||
|
}
|
||||||
|
case "windows":
|
||||||
|
path, err := windows.KnownFolderPath(windows.FOLDERID_Downloads, 0)
|
||||||
|
return path, err
|
||||||
|
case "darwin":
|
||||||
|
h, err := Home()
|
||||||
|
return h + "/Downloads", err
|
||||||
|
}
|
||||||
|
return "", errors.New("could not determine location for Downloads()")
|
||||||
|
}
|
||||||
|
|
||||||
|
func Fonts() (string, error) {
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "linux":
|
||||||
|
e, ok := os.LookupEnv("XDG_DATA_HOME" + "/fonts")
|
||||||
|
if ok {
|
||||||
|
return e, nil
|
||||||
|
} else {
|
||||||
|
h, err := Home()
|
||||||
|
return h + "/.local/share/fonts", err
|
||||||
|
}
|
||||||
|
case "windows":
|
||||||
|
return "", errors.New("windows has no per-user fonts dir")
|
||||||
|
case "darwin":
|
||||||
|
h, err := Home()
|
||||||
|
return h + "/Library/Fonts", err
|
||||||
|
}
|
||||||
|
return "", errors.New("could not determine location for Fonts()")
|
||||||
|
}
|
||||||
|
|
||||||
|
func Pictures() (string, error) {
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "linux":
|
||||||
|
e, ok := os.LookupEnv("XDG_PICTURES_DIR")
|
||||||
|
if ok {
|
||||||
|
return e, nil
|
||||||
|
}
|
||||||
|
case "windows":
|
||||||
|
path, err := windows.KnownFolderPath(windows.FOLDERID_Pictures, 0)
|
||||||
|
return path, err
|
||||||
|
case "darwin":
|
||||||
|
h, err := Home()
|
||||||
|
return h + "/Pictures", err
|
||||||
|
}
|
||||||
|
return "", errors.New("could not determine location for Pictures()")
|
||||||
|
}
|
||||||
|
|
||||||
|
func Public() (string, error) {
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "linux":
|
||||||
|
e, ok := os.LookupEnv("XDG_PUBLICSHARE_DIR")
|
||||||
|
if ok {
|
||||||
|
return e, nil
|
||||||
|
}
|
||||||
|
case "windows":
|
||||||
|
path, err := windows.KnownFolderPath(windows.FOLDERID_Public, 0)
|
||||||
|
return path, err
|
||||||
|
case "darwin":
|
||||||
|
h, err := Home()
|
||||||
|
return h + "/Public", err
|
||||||
|
}
|
||||||
|
return "", errors.New("could not determine location for Public()")
|
||||||
|
}
|
||||||
|
|
||||||
|
func Templates() (string, error) {
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "linux":
|
||||||
|
e, ok := os.LookupEnv("XDG_TEMPLATES_DIR")
|
||||||
|
if ok {
|
||||||
|
return e, nil
|
||||||
|
}
|
||||||
|
case "windows":
|
||||||
|
path, err := windows.KnownFolderPath(windows.FOLDERID_Templates, 0)
|
||||||
|
return path, err
|
||||||
|
case "darwin":
|
||||||
|
h, err := Home()
|
||||||
|
return h + "/Templates", err
|
||||||
|
}
|
||||||
|
return "", errors.New("could not determine location for Templates()")
|
||||||
|
}
|
||||||
|
|
||||||
|
func Videos() (string, error) {
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "linux":
|
||||||
|
e, ok := os.LookupEnv("XDG_VIDEOS_DIR")
|
||||||
|
if ok {
|
||||||
|
return e, nil
|
||||||
|
}
|
||||||
|
case "windows":
|
||||||
|
path, err := windows.KnownFolderPath(windows.FOLDERID_Videos, 0)
|
||||||
|
return path, err
|
||||||
|
case "darwin":
|
||||||
|
h, err := Home()
|
||||||
|
return h + "/Videos", err
|
||||||
|
}
|
||||||
|
return "", errors.New("could not determine location for Videos()")
|
||||||
|
}
|
Loading…
Reference in New Issue