config.go

 1package config
 2
 3import (
 4	"encoding/json"
 5	"os"
 6	"path/filepath"
 7)
 8
 9// Config stores the user's email configuration.
10type Config struct {
11	ServiceProvider string `json:"service_provider"`
12	Email           string `json:"email"`
13	Password        string `json:"password"`
14}
15
16// configDir returns the path to the configuration directory.
17func configDir() (string, error) {
18	home, err := os.UserHomeDir()
19	if err != nil {
20		return "", err
21	}
22	return filepath.Join(home, ".config", "email-cli"), nil
23}
24
25// configFile returns the full path to the configuration file.
26func configFile() (string, error) {
27	dir, err := configDir()
28	if err != nil {
29		return "", err
30	}
31	return filepath.Join(dir, "config.json"), nil
32}
33
34// SaveConfig saves the given configuration to the config file.
35func SaveConfig(config *Config) error {
36	path, err := configFile()
37	if err != nil {
38		return err
39	}
40	if err := os.MkdirAll(filepath.Dir(path), 0700); err != nil {
41		return err
42	}
43	data, err := json.MarshalIndent(config, "", "  ")
44	if err != nil {
45		return err
46	}
47	return os.WriteFile(path, data, 0600)
48}
49
50// LoadConfig loads the configuration from the config file.
51func LoadConfig() (*Config, error) {
52	path, err := configFile()
53	if err != nil {
54		return nil, err
55	}
56	data, err := os.ReadFile(path)
57	if err != nil {
58		return nil, err
59	}
60	var config Config
61	if err := json.Unmarshal(data, &config); err != nil {
62		return nil, err
63	}
64	return &config, nil
65}