anchor.diff:          description = "TCP port to be used for AFP.";
         };
   
  -      extraConfig = mkOption {
  -        type = types.lines;
  -        default = "";
  -        example = "uam list = uams_guest.so";
  +      settings = mkOption {
  +        inherit (settingsFormat) type;
  +        default = { };
  +        example = {
  +          Global = { "uam list" = "uams_guest.so"; };
  +          Homes = {
  +            path = "afp-data";
  +            "basedir regex" = "/home";
  +          };
  +          example-volume = {
  +            path = "/srv/volume";
  +            "read only" = true;
  +          };
  +        };
           description = ''
  -          Lines of configuration to add to the <literal>[Global]</literal> section.
  -          See <literal>man apf.conf</literal> for more information.
  -        '';
  -      };
  -
  -      homes = {
  -        enable = mkOption {
  -          type = types.bool;
  -          default = false;
  -          description = "Enable sharing of the UNIX server user home directories.";
  -        };
  -
  -        path = mkOption {
  -          type = types.str;
  -          default = "";
  -          example = "afp-data";
  -          description = "Share not the whole user home but this subdirectory path.";
  -        };
  -
  -        basedirRegex = mkOption {
  -          example = "/home";
  -          type = types.str;
  -          description = "Regex which matches the parent directory of the user homes.";
  -        };
  -
  -        extraConfig = mkOption {
  -          type = types.lines;
  -          default = "";
  -          description = ''
  -            Lines of configuration to add to the <literal>[Homes]</literal> section.
  -            See <literal>man apf.conf</literal> for more information.
  -          '';
  -         };
  -      };
  -
  -      volumes = mkOption {
  -        default = { };
  -        type = types.attrsOf (types.attrsOf types.unspecified);
  -        description =
  -          ''
  -            Set of AFP volumes to export.
  -            See <literal>man apf.conf</literal> for more information.
  -          '';
  -        example = literalExample ''
  -          { srv =
  -             { path = "/srv";
  -               "read only" = true;
  -               "hosts allow" = "10.1.0.0/16 10.2.1.100 2001:0db8:1234::/48";
  -             };
  -          }
  +          Configuration for Netatalk. See
  +          <citerefentry><refentrytitle>afp.conf</refentrytitle>
  +          <manvolnum>5</manvolnum></citerefentry>.
           '';
         };
   
  
positive.code: with lib;
  
  let
  
    cfg = config.services.netatalk;
  
    extmapFile = pkgs.writeText "extmap.conf" cfg.extmap;
  
    afpToString = x: if builtins.typeOf x == "bool"
                     then boolToString x
                     else toString x;
  
    volumeConfig = name:
      let vol = getAttr name cfg.volumes; in
      "[${name}]\n " + (toString (
         map
           (key: "${key} = ${afpToString (getAttr key vol)}\n")
           (attrNames vol)
      ));
  
    afpConf = ''[Global]
      extmap file = ${extmapFile}
      afp port = ${toString cfg.port}
  
      ${cfg.extraConfig}
  
      ${if cfg.homes.enable then ''[Homes]
      ${optionalString (cfg.homes.path != "") "path = ${cfg.homes.path}"}
      basedir regex = ${cfg.homes.basedirRegex}
      ${cfg.homes.extraConfig}
      '' else ""}
  
       ${toString (map volumeConfig (attrNames cfg.volumes))}
    '';
  
    afpConfFile = pkgs.writeText "afp.conf" afpConf;
  
  in
  
  {
    options = {
      services.netatalk = {
  
  
negative.code:         default = "";
          description = ''
            File name extension mappings.
            See <citerefentry><refentrytitle>extmap.conf</refentrytitle>
            <manvolnum>5</manvolnum></citerefentry>. for more information.
          '';
        };
  
      };
    };
  
    imports = (map (option:
      mkRemovedOptionModule [ "services" "netatalk" option ]
      "This option was removed in favor of `services.netatalk.settings`.") [
        "extraConfig"
        "homes"
        "volumes"
      ]);
  
    config = mkIf cfg.enable {
  
      services.netatalk.settings.Global = {
        "afp port" = toString cfg.port;
        "extmap file" = "${pkgs.writeText "extmap.conf" cfg.extmap}";
      };
  
      systemd.services.netatalk = {
        description = "Netatalk AFP fileserver for Macintosh clients";
        unitConfig.Documentation =
          "man:afp.conf(5) man:netatalk(8) man:afpd(8) man:cnid_metad(8) man:cnid_dbd(8)";
        after = [ "network.target" "avahi-daemon.service" ];
        wantedBy = [ "multi-user.target" ];
  
  