package main import ( "fmt" "os" "path/filepath" ) // dataDir returns the data directory and creates it with mode 0700 when it does // not exist. It is ONECHAT_DIR when that is set. Otherwise it is // $XDG_DATA_HOME/onechat when XDG_DATA_HOME is an absolute path, or else // ~/.local/share/onechat. func dataDir() (string, error) { dir := os.Getenv("ONECHAT_DIR") if dir == "" { var err error dir, err = defaultDataDir() if err != nil { return "", err } } err := os.MkdirAll(dir, 0o700) if err != nil { return "", fmt.Errorf("create data directory: %w", err) } return dir, nil } // defaultDataDir returns the data directory for an unset ONECHAT_DIR. The XDG // specification says to ignore a relative XDG_DATA_HOME. func defaultDataDir() (string, error) { xdg := os.Getenv("XDG_DATA_HOME") if filepath.IsAbs(xdg) { return filepath.Join(xdg, "onechat"), nil } home, err := os.UserHomeDir() if err != nil { return "", fmt.Errorf("find data directory: set ONECHAT_DIR: %w", err) } return filepath.Join(home, ".local", "share", "onechat"), nil }