{ config, lib, pkgs, ... }: with lib; let cfg = config.programs.newsboat; wrapQuote = x: ''"${x}"''; in { options = { programs.newsboat = { enable = mkEnableOption "the Newsboat feed reader"; urls = mkOption { type = types.listOf (types.submodule { options = { url = mkOption { type = types.str; example = "http://example.com"; description = "Feed URL."; }; tags = mkOption { type = types.listOf types.str; default = [ ]; example = [ "foo" "bar" ]; description = "Feed tags."; }; title = mkOption { type = types.nullOr types.str; default = null; example = "ORF News"; description = "Feed title."; }; }; }); default = [ ]; example = [{ url = "http://example.com"; tags = [ "foo" "bar" ]; }]; description = "List of news feeds."; }; maxItems = mkOption { type = types.int; default = 0; description = "Maximum number of items per feed, 0 for infinite."; }; reloadThreads = mkOption { type = types.int; default = 5; description = "How many threads to use for updating the feeds."; }; autoReload = mkOption { type = types.bool; default = false; description = '' Whether to enable automatic reloading while newsboat is running. ''; }; reloadTime = mkOption { type = types.nullOr types.int; default = 60; description = "Time in minutes between reloads."; }; browser = mkOption { type = types.str; default = "${pkgs.xdg_utils}/bin/xdg-open"; description = "External browser to use."; }; queries = mkOption { type = types.attrsOf types.str; default = { }; example = { "foo" = ''rssurl =~ "example.com"''; }; description = "A list of queries to use."; }; extraConfig = mkOption { type = types.lines; default = ""; description = '' Extra configuration values that will be appended to the end. ''; }; }; }; config = mkIf cfg.enable { home.packages = [ pkgs.newsboat ]; home.file.".newsboat/urls".text = let mkUrlEntry = u: concatStringsSep " " ([ u.url ] ++ map wrapQuote u.tags ++ optional (u.title != null) (wrapQuote "~${u.title}")); urls = map mkUrlEntry cfg.urls; mkQueryEntry = n: v: ''"query:${n}:${escape [ ''"'' ] v}"''; queries = mapAttrsToList mkQueryEntry cfg.queries; in concatStringsSep "\n" (if versionAtLeast config.home.stateVersion "20.03" then queries ++ urls else urls ++ queries) + "\n"; home.file.".newsboat/config".text = '' max-items ${toString cfg.maxItems} browser ${cfg.browser} reload-threads ${toString cfg.reloadThreads} auto-reload ${if cfg.autoReload then "yes" else "no"} ${optionalString (cfg.reloadTime != null) (toString "reload-time ${toString cfg.reloadTime}")} prepopulate-query-feeds yes ${cfg.extraConfig} ''; }; }