summaryrefslogtreecommitdiff
path: root/files.go
blob: e5fba09ef675be5ab6218b9efdb72aebb110711d (plain)
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package main

import (
	"bufio"
	"errors"
	"fmt"
	"os"
	"path/filepath"
	"strings"
	"syscall"

	"github.com/BurntSushi/toml"
)

type Config struct {
	DefaultScheme  string `toml:"default_scheme"`
	SoftWrap       int    `toml:"soft_wrap"`
	DownloadFolder string `toml:"download_folder"`
}

func getConfig() (*Config, error) {
	home := os.Getenv("HOME")
	path := os.Getenv("XDG_CONFIG_HOME")
	if path == "" {
		path = filepath.Join(home, ".config")
	}
	path = filepath.Join(path, "x-1", "config.toml")

	if err := ensurePath(path); err != nil {
		return nil, err
	}

	c := Config{
		DefaultScheme:  "gemini",
		SoftWrap:       80,
		DownloadFolder: home,
	}
	if _, err := toml.DecodeFile(path, &c); err != nil {
		return nil, err
	}
	if strings.HasPrefix(c.DownloadFolder, "~") {
		c.DownloadFolder = home + c.DownloadFolder[1:]
	}
	return &c, nil
}

func getMarks() (map[string]string, error) {
	path, err := marksFilePath()
	if err != nil {
		return nil, err
	}

	marks := make(map[string]string)

	f, err := os.Open(path)
	if err != nil {
		return nil, err
	}
	rdr := bufio.NewScanner(f)

	for rdr.Scan() {
		line := rdr.Text()
		name, target, _ := strings.Cut(line, ":")
		marks[name] = target
	}
	if err := rdr.Err(); err != nil {
		return nil, err
	}

	return marks, nil
}

func saveMarks(marks map[string]string) error {
	path, err := marksFilePath()
	if err != nil {
		return err
	}

	f, err := os.OpenFile(path, os.O_WRONLY, 0o600)
	if err != nil {
		return err
	}
	defer func() { _ = f.Close() }()

	for name, target := range marks {
		_, err := fmt.Fprintf(f, "%s:%s\n", name, target)
		if err != nil {
			return err
		}
	}

	return nil
}

func marksFilePath() (string, error) {
	home := os.Getenv("HOME")
	path := os.Getenv("XDG_DATA_HOME")
	if path == "" {
		path = filepath.Join(home, ".local", "share")
	}
	path = filepath.Join(path, "x-1", "marks")

	if err := ensurePath(path); err != nil {
		return "", err
	}

	return path, nil
}

func ensurePath(fpath string) error {
	if _, err := os.Stat(fpath); errors.Is(err, syscall.ENOENT) {
		if err := os.MkdirAll(filepath.Dir(fpath), 0o700); err != nil {
			return err
		}
		f, err := os.OpenFile(fpath, os.O_RDWR|os.O_CREATE, 0o600)
		if err != nil {
			return err
		}
		_ = f.Close()
	}
	return nil
}