{ lib, ... }: let feed = with lib; types.submodule ({ config, ... }: { options = { freq = mkOption { type = types.enum [ "hourly" "daily" "weekly" "infrequent" ]; default = "infrequent"; }; cat = mkOption { type = types.enum [ "art" "humor" "pol" "rat" "tech" "uncat" ]; default = "uncat"; }; format = mkOption { type = types.enum [ "text" "image" "podcast" "video" ]; default = "text"; }; title = mkOption { type = types.nullOr types.str; default = null; }; url = mkOption { type = types.str; description = '' url to a RSS feed ''; }; substack = mkOption { type = types.nullOr types.str; default = null; description = '' if the feed is a substack domain, just enter the subdomain here and the url/format field can be populated automatically ''; }; }; config = lib.mkIf (config.substack != null) { url = "https://${config.substack}.substack.com/feed"; format = "text"; }; }); in { # we don't explicitly generate anything from the feeds here. # instead, config.sane.feeds is used by a variety of services at their definition site. options = with lib; { sane.feeds = mkOption { type = types.listOf feed; default = []; description = '' RSS feeds indexed by a human-readable name. ''; }; }; }