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}