summaryrefslogtreecommitdiff
path: root/files.go
diff options
context:
space:
mode:
Diffstat (limited to 'files.go')
-rw-r--r--files.go122
1 files changed, 122 insertions, 0 deletions
diff --git a/files.go b/files.go
new file mode 100644
index 0000000..e5fba09
--- /dev/null
+++ b/files.go
@@ -0,0 +1,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
+}