]> git.giacomolli.uk - onechat/blob - datadir.go
Write the log rules in the Go skill
[onechat] / datadir.go
1 package main
2
3 import (
4         "fmt"
5         "os"
6         "path/filepath"
7 )
8
9 // dataDir returns the data directory and creates it with mode 0700 when it does
10 // not exist. It is ONECHAT_DIR when that is set. Otherwise it is
11 // $XDG_DATA_HOME/onechat when XDG_DATA_HOME is an absolute path, or else
12 // ~/.local/share/onechat.
13 func dataDir() (string, error) {
14         dir := os.Getenv("ONECHAT_DIR")
15         if dir == "" {
16                 var err error
17
18                 dir, err = defaultDataDir()
19                 if err != nil {
20                         return "", err
21                 }
22         }
23
24         err := os.MkdirAll(dir, 0o700)
25         if err != nil {
26                 return "", fmt.Errorf("create data directory: %w", err)
27         }
28
29         return dir, nil
30 }
31
32 // defaultDataDir returns the data directory for an unset ONECHAT_DIR. The XDG
33 // specification says to ignore a relative XDG_DATA_HOME.
34 func defaultDataDir() (string, error) {
35         xdg := os.Getenv("XDG_DATA_HOME")
36         if filepath.IsAbs(xdg) {
37                 return filepath.Join(xdg, "onechat"), nil
38         }
39
40         home, err := os.UserHomeDir()
41         if err != nil {
42                 return "", fmt.Errorf("find data directory: set ONECHAT_DIR: %w", err)
43         }
44
45         return filepath.Join(home, ".local", "share", "onechat"), nil
46 }