{ lib, pkgs, cfg, allPhones, intercomEntries }: let baseUrl = "http://${cfg.serverAddress}:${toString cfg.directoryPort}"; hasPageExtensions = lib.any (e: e.mode == "page") (lib.attrValues cfg.extensions); hasPhonebook = cfg.phonebook != []; # Deduplicated directory entries: one per extension, using the displayName from # allPhones (all phones sharing an extension have the same displayName). extensionEntries = lib.attrValues (lib.foldlAttrs (acc: _key: phone: if lib.hasAttr phone.extension acc || phone.displayName == "" then acc else acc // { ${phone.extension} = { inherit (phone) extension displayName; }; } ) {} allPhones); menuXml = '' ${cfg.directoryName} Telefonbuch Ihre Wahl Internes Telefonbuch ${baseUrl}/directory-list.xml '' + lib.optionalString (intercomEntries != [] || hasPageExtensions) '' Intercom / Durchsage ${baseUrl}/intercom.xml '' + lib.optionalString hasPhonebook '' Externes Telefonbuch ${baseUrl}/phonebook.xml '' + '' ''; listXml = '' ${cfg.directoryName} Telefonbuch Ihre Wahl '' + lib.concatMapStringsSep "\n" (e: '' ${e.displayName} ${e.extension} '') extensionEntries + '' ''; intercomXml = '' Intercom / Durchsage Ihre Wahl '' + lib.concatStringsSep "\n" (lib.mapAttrsToList (ext: extCfg: lib.optionalString (extCfg.mode == "page" && extCfg.displayName != "") '' ${extCfg.displayName} ${ext} '') cfg.extensions) + lib.concatMapStringsSep "\n" (ic: '' ${ic.displayName} ${ic.extension} '') intercomEntries + '' ''; phonebookMenuXml = '' Externes Telefonbuch Bitte wählen '' + lib.concatStringsSep "\n" (lib.imap0 (i: contact: '' ${contact.name} ${baseUrl}/phonebook-${toString i}.xml '') cfg.phonebook) + '' ''; mkContactXml = contact: '' ${contact.name} Bitte wählen '' + lib.concatStringsSep "\n" (lib.mapAttrsToList (label: number: '' ${label} ${number} '') contact.numbers) + '' ''; in { menuFile = pkgs.writeText "directory.xml" menuXml; listFile = pkgs.writeText "directory-list.xml" listXml; intercomFile = pkgs.writeText "intercom.xml" intercomXml; phonebookMenuFile = pkgs.writeText "phonebook.xml" phonebookMenuXml; phonebookDetailFiles = lib.imap0 (i: contact: pkgs.writeText "phonebook-${toString i}.xml" (mkContactXml contact) ) cfg.phonebook; }