code.oscarkilo.com/okg/config.go

.gitignore
README.md
auth.go
client.go
config.go
go.mod
main.go
okg_test.go
pr.go
repo.go
package main

import "encoding/json"
import "fmt"
import "os"
import "path/filepath"

type Config struct {
  Host   string `json:"host"`
  ApiKey string `json:"api_key"`
}

func configPath() string {
  home, err := os.UserHomeDir()
  if err != nil {
    return ""
  }
  return filepath.Join(home, ".config", "okg", "config.json")
}

func loadConfig() (*Config, error) {
  c := &Config{}

  // Load from file.
  path := configPath()
  if path != "" {
    data, err := os.ReadFile(path)
    if err == nil {
      json.Unmarshal(data, c)
    }
  }

  // Env overrides.
  if v := os.Getenv("OKG_HOST"); v != "" {
    c.Host = v
  }
  if v := os.Getenv("KLEX_API_KEY"); v != "" {
    c.ApiKey = v
  }

  // Defaults.
  if c.Host == "" {
    c.Host = "http://localhost:42069"
  }

  return c, nil
}

func saveConfig(c *Config) error {
  path := configPath()
  if path == "" {
    return fmt.Errorf("cannot determine home directory")
  }
  dir := filepath.Dir(path)
  if err := os.MkdirAll(dir, 0700); err != nil {
    return fmt.Errorf("mkdir %s: %v", dir, err)
  }
  data, err := json.MarshalIndent(c, "", "  ")
  if err != nil {
    return err
  }
  return os.WriteFile(path, data, 0600)
}