{ lib, ... }:

let
  mkLineLimiterOpts = limit: {
    colorcolumn = toString (limit + 1);
    textwidth = limit;
  };

  mkLineLimiterGroup = { limit, pattern }:
    lib.nameValuePair
      "line-limiter-${toString limit}"
      {
        inherit pattern;
        opt = mkLineLimiterOpts limit;
      };
in
{
  buffer.filetype = lib.listToAttrs [
    (mkLineLimiterGroup {
      limit = 100;
      pattern = [
        "nix"
        "javascript,javascriptreact"
        "typescript,typescriptreact"
        "vue"
        "rust"
        "haskell"
      ];
    })
    (mkLineLimiterGroup {
      limit = 90;
      pattern = [
        "python"
      ];
    })
    (mkLineLimiterGroup {
      limit = 80;
      pattern = [
        "json"
        "yaml"
        "markdown"
        "html,htmldjango"
        "css,scss,less"
        "sql,psql"
      ];
    })
  ];
}