diff --git a/README.md b/README.md index 939bbb86..4d61807a 100644 --- a/README.md +++ b/README.md @@ -206,6 +206,7 @@ Other dedicated linters that are built-in are: | [Spectral][spectral] | `spectral` | | [sphinx-lint][sphinx-lint] | `sphinx-lint` | | [sqlfluff][sqlfluff] | `sqlfluff` | +| [sqruff][sqruff] | `sqruff` | | [standardjs][standardjs] | `standardjs` | | [StandardRB][27] | `standardrb` | | [statix check][33] | `statix` | @@ -529,6 +530,7 @@ busted tests/ [cue]: https://github.com/cue-lang/cue [curlylint]: https://www.curlylint.org/ [sqlfluff]: https://github.com/sqlfluff/sqlfluff +[sqruff]: https://github.com/quarylabs/sqruff [verilator]: https://verilator.org/guide/latest/ [actionlint]: https://github.com/rhysd/actionlint [buf_lint]: https://github.com/bufbuild/buf diff --git a/lua/lint/linters/sqruff.lua b/lua/lint/linters/sqruff.lua new file mode 100644 index 00000000..a33ff247 --- /dev/null +++ b/lua/lint/linters/sqruff.lua @@ -0,0 +1,40 @@ +local severities = { + Error = vim.diagnostic.severity.ERROR, + Warning = vim.diagnostic.severity.WARN, +} + +return { + cmd = "sqruff", + stdin = true, + args = { + "lint", + "--format=json", + "-", + }, + ignore_exitcode = true, + parser = function(output, _) + if vim.trim(output) == "" or output == nil then + return {} + end + + + local decoded = vim.json.decode(output) + local diagnostics = {} + local messages = decoded[""] + + for _, msg in ipairs(messages or {}) do + table.insert(diagnostics, { + lnum = msg.range.start.line - 1, + end_lnum = msg.range["end"].line - 1, + col = msg.range.start.character - 1, + end_col = msg.range["end"].character - 1, + message = msg.message, + -- code not provided: https://github.com/quarylabs/sqruff/issues/1219 + source = msg.source, + severity = assert(severities[msg.severity], "missing mapping for severity " .. msg.severity), + }) + end + + return diagnostics + end, +}