{ lib, pkgs, config, ... }: let inherit (lib) mkEnableOption mkPackageOption mkOption mkIf mkMerge types literalExpression mapAttrs' nameValuePair ; cfg = config.programs.rio; settingsFormat = pkgs.formats.toml { }; in { options.programs.rio = { enable = mkEnableOption null // { description = '' Enable Rio, a terminal built to run everywhere, as a native desktop applications by Rust/WebGPU or even in the browsers powered by WebAssembly/WebGPU. ''; }; package = mkPackageOption pkgs "rio" { nullable = true; }; settings = mkOption { type = settingsFormat.type; default = { }; description = '' Configuration written to {file}`$XDG_CONFIG_HOME/rio/config.toml`. See for options. ''; }; themes = mkOption { type = with types; attrsOf (either settingsFormat.type path); default = { }; description = '' Theme files written to {file}`$XDG_CONFIG_HOME/rio/themes/`. See for supported values. ''; example = literalExpression '' { foobar.colors = { background = "#282a36"; green = "#50fa7b"; dim-green = "#06572f"; }; } ''; }; }; meta.maintainers = [ lib.maintainers.otavio ]; config = mkIf cfg.enable (mkMerge [ { home.packages = mkIf (cfg.package != null) [ cfg.package ]; } # Only manage configuration if not empty (mkIf (cfg.settings != { }) { xdg.configFile."rio/config.toml".source = if builtins.isPath cfg.settings then cfg.settings else settingsFormat.generate "rio.toml" cfg.settings; }) (mkIf (cfg.themes != { }) { xdg.configFile = mapAttrs' ( name: value: nameValuePair "rio/themes/${name}.toml" { source = if builtins.isPath value then value else settingsFormat.generate "rio-theme-${name}.toml" value; } ) cfg.themes; }) ]); }