{ config, lib, pkgs, ... }: let inherit (lib) any attrValues concatMapStringsSep getExe mapAttrs' mkDefault mkDerivedConfig mkIf mkOption nameValuePair replaceStrings types; cfg = config.services.home-assistant; format = pkgs.formats.yaml {}; configFilesList = attrValues cfg.configFiles; in { options.services.home-assistant = { configFiles = mkOption { default = {}; description = '' Set of files that have to be linked in the configuration directory. ''; type = types.attrsOf (types.submodule ( { name, config, options, ... }: { options = { enable = mkOption { type = types.bool; default = true; description = '' Whether this file should be generated. This option allows specific files to be disabled. ''; }; target = mkOption { type = types.str; description = '' Name of symlink (relative to config directory). Defaults to the attribute name. ''; }; text = mkOption { default = null; type = types.nullOr types.lines; description = "Text of the file."; }; source = mkOption { type = types.path; description = "Path of the source file."; }; }; config = { target = mkDefault name; source = mkIf (config.text != null) ( let name' = "haConf-" + replaceStrings ["/"] ["-"] name; in mkDerivedConfig options.text (pkgs.writeText name') ); }; } )); }; customSentences = mkOption { type = types.attrsOf (types.submodule { freeformType = format.type; options.language = mkOption { type = types.str; }; }); }; }; config = mkIf cfg.enable { systemd.services.home-assistant = mkIf ( cfg.configFiles != {} && any (c: c.enable) configFilesList ) { preStart = let inherit (cfg) configDir; mkLink = configFile: '' mkdir -p ${configDir}/${dirOf configFile.target} cp -rf ${configFile.source} ${configDir}/${configFile.target} ''; in getExe (pkgs.writeShellApplication { name = "home-assistant-pre-start"; text = concatMapStringsSep "\n" mkLink configFilesList; }); }; services.home-assistant.configFiles = mapAttrs' (n: v: nameValuePair "custom_sentences/${v.language}/${n}.yaml" { source = format.generate n v; }) cfg.customSentences; }; }