cfg: {
  lib,
  name,
  ...
}: let
  inherit (lib) literalExpression mkOption types;
in {
  options = {
    subDomainName = mkOption {
      type = types.str;
      default = name;
      description = "The sub domain name to handle.";
    };

    reverseProxy = mkOption {
      type = types.nullOr types.str;
      default = null;
      description = ''
        Option to give the parameters to a simple "reverse_proxy" command
        appended after extraConfig.
      '';
    };

    subDirectories = mkOption {
      type = types.attrsOf (types.submodule (import ./sub-dir-options.nix cfg));
      default = {};
      example = literalExpression ''
        {
          headscale = {
            appSupport = false;
            reverseProxy = "localhost:8080";
            extraConfig = '''
              encode gzip
            ''';
          };
        };
      '';
      description = ''
        Declarative specification of a subdomain's subdirectories served by Caddy.
      '';
    };

    extraConfig = mkOption {
      type = types.lines;
      default = "";
      description = ''
        Additional lines of configuration appended to this sub domain in the
        automatically generated `Caddyfile`.
      '';
    };
  };
}