#!/usr/bin/env nu

let shell_files = ls **/*.sh | get name
let nix_files = ls **/*.nix | where name !~ "hardware-configuration.nix|_sources" | get name

let linters = [
  ([shellcheck] ++ $shell_files)
  ([nixfmt --check --strict] ++ $nix_files)
  ([deadnix --fail] ++ $nix_files)
  ([statix check] ++ $nix_files)
]

mkdir $env.out

def run-linter [linterArgs: list<string>] {
  print $'Running ($linterArgs.0)...'

  let exit_code = try {
    ^$linterArgs.0 ...($linterArgs | skip 1)
    $env.LAST_EXIT_CODE
  } catch {|e| $e.exit_code}

  [$linterArgs.0, $exit_code]
}

let results = $linters | each {|linter| run-linter $linter}

print 'Linter results:'

let success = $results | each {|result|
  match $result.1 {
    0 => {print $'(ansi green)($result.0)(ansi reset)'}
    _ => {print $'(ansi red)($result.0)(ansi reset)'}
  }

  $result.1
} | math sum

exit $success