diff --git a/internal/config/config.go b/internal/config/config.go index 316f8a1..1ff0a1f 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -14,12 +14,50 @@ import ( //go:embed defaults.yaml var defaultsYAML []byte +type Packages struct { + Base []string `yaml:"base"` +} +type ArduinoCLIConfig struct { + Version string `yaml:"version"` + URL string `yaml:"url"` + Cores []string `yaml:"cores"` +} +type ZshPlugin struct { + Name string `yaml:"name"` + Repo string `yaml:"repo"` +} +type ZshConfig struct { + OhMyZshRepo string `yaml:"oh_my_zsh_repo"` + Plugins []ZshPlugin `yaml:"plugins"` +} +type ZellijConfig struct { + ConfigURL string `yaml:"config_url"` +} +type ThemesConfig struct { + Source string `yaml:"source"` +} +type ShellConfigBlock struct { + Name string `yaml:"name"` + File string `yaml:"file"` + Content string `yaml:"content"` +} +type ShellConfigSection struct { + Blocks []ShellConfigBlock `yaml:"blocks"` +} + // Config is the fully-resolved runtime configuration. type Config struct { - Version int `yaml:"version"` - ExtraPackages []string `yaml:"extra_packages"` - DisabledModules []string `yaml:"disabled_modules"` - ThemeOverrides map[string]string `yaml:"theme_overrides"` + Version int `yaml:"version"` + ExtraPackages []string `yaml:"extra_packages"` + DisabledModules []string `yaml:"disabled_modules"` + ThemeOverrides map[string]string `yaml:"theme_overrides"` + Packages Packages `yaml:"packages"` + Fonts []string `yaml:"fonts"` + ArduinoCLI ArduinoCLIConfig `yaml:"arduino_cli"` + Zsh ZshConfig `yaml:"zsh"` + Zellij ZellijConfig `yaml:"zellij"` + Themes ThemesConfig `yaml:"themes"` + ShellConfig ShellConfigSection `yaml:"shell_config"` } const currentVersion = 1 @@ -78,5 +116,26 @@ func merge(base, over Config) Config { } out.ThemeOverrides = merged } + if len(over.Packages.Base) > 0 { + out.Packages = over.Packages + } + if len(over.Fonts) > 0 { + out.Fonts = over.Fonts + } + if over.ArduinoCLI.Version != "" { + out.ArduinoCLI = over.ArduinoCLI + } + if over.Zsh.OhMyZshRepo != "" { + out.Zsh = over.Zsh + } + if over.Zellij.ConfigURL != "" { + out.Zellij = over.Zellij + } + if over.Themes.Source != "" { + out.Themes = over.Themes + } + if len(over.ShellConfig.Blocks) > 0 { + out.ShellConfig = over.ShellConfig + } return out } diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 9bc6db8..db6cf95 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -48,6 +48,31 @@ theme_overrides: } } +func TestDefaultsCarryModuleInputs(t *testing.T) { + cfg, err := Load("/nonexistent/overlay.yaml") + if err != nil { + t.Fatal(err) + } + if len(cfg.Packages.Base) == 0 { + t.Error("Packages.Base empty") + } + if len(cfg.Fonts) == 0 { + t.Error("Fonts empty") + } + if cfg.ArduinoCLI.Version == "" { + t.Error("ArduinoCLI.Version empty") + } + if cfg.ArduinoCLI.URL == "" { + t.Error("ArduinoCLI.URL empty") + } + if cfg.Zsh.OhMyZshRepo == "" { + t.Error("Zsh.OhMyZshRepo empty") + } + if len(cfg.ShellConfig.Blocks) == 0 { + t.Error("ShellConfig.Blocks empty") + } +} + func TestLoadRejectsUnknownVersion(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "overlay.yaml") diff --git a/internal/config/defaults.yaml b/internal/config/defaults.yaml index 94293d7..e25e5ff 100644 --- a/internal/config/defaults.yaml +++ b/internal/config/defaults.yaml @@ -2,3 +2,81 @@ version: 1 extra_packages: [] disabled_modules: [] theme_overrides: {} + +packages: + base: + - base-devel + - git + - curl + - wget + - unzip + - zip + - tree + - htop + - neofetch + - ripgrep + - fd + - bat + - eza + - jq + - zsh + - clang + - ca-certificates + +fonts: + - ttf-jetbrains-mono-nerd + +arduino_cli: + version: "0.35.3" + url: "https://github.com/arduino/arduino-cli/releases/download/v0.35.3/arduino-cli_0.35.3_Linux_64bit.tar.gz" + cores: + - arduino:avr + +zsh: + oh_my_zsh_repo: "https://github.com/ohmyzsh/ohmyzsh.git" + plugins: + - name: zsh-autosuggestions + repo: https://github.com/zsh-users/zsh-autosuggestions + - name: zsh-syntax-highlighting + repo: https://github.com/zsh-users/zsh-syntax-highlighting.git + +zellij: + config_url: "" + +themes: + source: "lib/themes" + +shell_config: + blocks: + - name: archduino-path + file: ".zshrc" + content: | + export PATH="$HOME/.local/bin:$PATH" + - name: archduino-editor + file: ".zshrc" + content: | + export EDITOR="nvim" + export VISUAL="nvim" + - name: archduino-starship + file: ".zshrc" + content: | + eval "$(starship init zsh)" + - name: archduino-zellij + file: ".zshrc" + content: | + if [[ -z "$ZELLIJ" ]]; then + zellij attach --create archduino + fi + - name: archduino-aliases + file: ".zshrc" + content: | + alias adev="zellij --layout arduino" + alias ac="arduino-cli" + alias acc="arduino-cli compile" + alias acu="arduino-cli upload" + alias acm="arduino-cli monitor" + alias acb="arduino-cli board list" + alias lg="lazygit" + alias v="nvim" + alias y="yazi" + alias theme="archduino-theme"