{ lib, stdenvNoCC, fetchFromGitHub, fetchzip, nix-update-script }:

let
  buildStyle =
    { name
    , stylePath ? name
    , ...
    }@args:
    stdenvNoCC.mkDerivation ({
      pname = "vale-style-${lib.toLower name}";

      dontConfigure = true;
      dontBuild = true;
      doCheck = false;
      dontFixup = true;

      installPhase = ''
        runHook preInstall
        mkdir -p $out/share/vale/styles
        cp -R ${stylePath} "$out/share/vale/styles/${name}"
        runHook postInstall
      '';

      passthru.updateScript = nix-update-script { };

      meta = {
        platforms = lib.platforms.all;
        maintainers = with lib.maintainers; [ katexochen ];
      } // (args.meta or { });
    } // removeAttrs args [ "meta" "name" ]);
in
{
  alex = buildStyle rec {
    name = "alex";
    version = "0.2.2";
    src = fetchFromGitHub {
      owner = "errata-ai";
      repo = "alex";
      rev = "v${version}";
      hash = "sha256-mfeMa+KlkqwyS+h+oo5p5+P2bsmZ0BOph2nbQiaoNqM=";
    };
    meta = {
      description = "Vale-compatible implementation of the guidelines enforced by the alex linter";
      homepage = "https://github.com/errata-ai/alex";
      license = lib.licenses.mit;
    };
  };

  google = buildStyle rec {
    name = "Google";
    version = "0.6.1";
    src = fetchFromGitHub {
      owner = "errata-ai";
      repo = "Google";
      rev = "v${version}";
      hash = "sha256-jSmfUgzlIbDVh2zLtnTNpM/z6dHMp358F9adLZ5+qcw=";
    };
    meta = {
      description = "Vale-compatible implementation of the Google Developer Documentation Style Guide";
      homepage = "https://github.com/errata-ai/Google";
      license = lib.licenses.mit;
    };
  };

  joblint = buildStyle rec {
    name = "Joblint";
    version = "0.4.1";
    src = fetchFromGitHub {
      owner = "errata-ai";
      repo = "Joblint";
      rev = "v${version}";
      hash = "sha256-zRz5ThOg5RLTZj3dYPe0PDvOF5DjO31lduSpi2Us87U=";
    };
    meta = {
      description = "Vale-compatible implementation of the Joblint linter";
      homepage = "https://github.com/errata-ai/Joblint";
      license = lib.licenses.mit;
    };
  };

  microsoft = buildStyle rec {
    name = "Microsoft";
    version = "0.14.1";
    src = fetchFromGitHub {
      owner = "errata-ai";
      repo = "Microsoft";
      rev = "v${version}";
      hash = "sha256-4j05bIGAVEy6untUqtrUxdLKlhyOcJsbcsow8OxRp1A=";
    };
    meta = {
      description = "Vale-compatible implementation of the Microsoft Writing Style Guide";
      homepage = "https://github.com/errata-ai/Microsoft";
      license = lib.licenses.mit;
    };
  };

  proselint = buildStyle rec {
    name = "proselint";
    version = "0.3.4";
    src = fetchFromGitHub {
      owner = "errata-ai";
      repo = "proselint";
      rev = "v${version}";
      hash = "sha256-ryKJDX1JrvDWVKLC5qQGctweDf74yuwEXxl/IqumM4s=";
    };
    meta = {
      description = "Vale-compatible implementation of Python's proselint linter";
      homepage = "https://github.com/errata-ai/proselint";
      license = lib.licenses.bsd3;
    };
  };

  readability = buildStyle rec {
    name = "Readability";
    version = "0.1.1";
    src = fetchFromGitHub {
      owner = "errata-ai";
      repo = "readability";
      rev = "v${version}";
      hash = "sha256-5Y9v8QsZjC2w3/pGIcL5nBdhpogyJznO5IFa0s8VOOI=";
    };
    meta = {
      description = "Vale-compatible implementations of many popular \"readability\" metrics";
      homepage = "https://github.com/errata-ai/readability";
      license = lib.licenses.mit;
    };
  };

  write-good = buildStyle rec {
    name = "write-good";
    version = "0.4.1";
    src = fetchFromGitHub {
      owner = "errata-ai";
      repo = "write-good";
      rev = "v${version}";
      hash = "sha256-W/eHlXklAVlAnY8nLPi/SIKsg8UUnH8UkH99BDo5yKk=";
    };
    meta = {
      description = "Vale-compatible implementation of the write-good linter";
      homepage = "https://github.com/errata-ai/write-good";
      license = lib.licenses.mit;
    };
  };
}
