diff options
Diffstat (limited to 'files.go')
| -rw-r--r-- | files.go | 122 |
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 +} |
