You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
smug/config.go

120 lines
2.3 KiB
Go

package main
import (
"io/ioutil"
"os"
"os/exec"
"path"
"strings"
"gopkg.in/yaml.v2"
)
type Pane struct {
Root string `yaml:"root,omitempty"`
Type string `yaml:"type,omitempty"`
Commands []string `yaml:"commands"`
}
type Window struct {
Name string `yaml:"name"`
Root string `yaml:"root,omitempty"`
BeforeStart []string `yaml:"before_start"`
Panes []Pane `yaml:"panes"`
Commands []string `yaml:"commands"`
Layout string `yaml:"layout"`
Manual bool `yaml:"manual,omitempty"`
}
type Config struct {
SendKeysTimeout int `yaml:"sendkeys_timeout"`
Session string `yaml:"session"`
Env map[string]string `yaml:"env"`
Root string `yaml:"root"`
BeforeStart []string `yaml:"before_start"`
Stop []string `yaml:"stop"`
Windows []Window `yaml:"windows"`
}
func addDefaultEnvs(c *Config, path string) {
c.Env["SMUG_SESSION"] = c.Session
c.Env["SMUG_SESSION_CONFIG_PATH"] = path
}
func EditConfig(path string) error {
editor := os.Getenv("EDITOR")
if editor == "" {
editor = "vim"
}
cmd := exec.Command(editor, path)
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}
func GetConfig(path string, settings map[string]string) (*Config, error) {
f, err := ioutil.ReadFile(path)
if err != nil {
return nil, err
}
config := string(f)
c, err := ParseConfig(config, settings)
if err != nil {
return nil, err
}
addDefaultEnvs(&c, path)
return &c, err
}
func ParseConfig(data string, settings map[string]string) (Config, error) {
data = os.Expand(data, func(v string) string {
if val, ok := settings[v]; ok {
return val
}
if val, ok := os.LookupEnv(v); ok {
return val
}
return v
})
c := Config{
Env: make(map[string]string),
}
err := yaml.Unmarshal([]byte(data), &c)
if err != nil {
return Config{}, err
}
return c, nil
}
func ListConfigs(dir string) ([]string, error) {
var result []string
files, err := ioutil.ReadDir(dir)
if err != nil {
return result, err
}
for _, file := range files {
fileExt := path.Ext(file.Name())
if fileExt != ".yml" {
continue
}
result = append(result, strings.TrimSuffix(file.Name(), fileExt))
}
return result, nil
}