{ lib, ... }:
let
  inherit (lib) mkOption stringLength;
  inherit (lib.types) str strMatching nullOr;

  validateUserName =
    x:
    assert (
      stringLength x < 32 || abort "Username '${x}' is longer than 31 characters which is not allowed!"
    );
    x;
in
{
  options.modules.meta = {
    hostname = mkOption {
      type = strMatching "^[[:alnum:]]([[:alnum:]_-]{0,61}[[:alnum:]])?$";
      default = "";
      description = "The system's hostname.";
    };
    username = mkOption {
      default = "";
      type = str;
      apply = validateUserName;
      # Should handle multiple users one day? maybe...
      description = "This system's primary user.";
    };
    tailscale = {
      ip = mkOption {
        default = null;
        type = nullOr str;
      };
    };
  };
}