trixy 0.3.3

A rust crate used to generate multi-language apis for your application
Documentation
# Copyright (C) 2023 - 2024:
# The Trinitrix Project <soispha@vhack.eu, antifallobst@systemausfall.org>
# SPDX-License-Identifier: LGPL-3.0-or-later
#
# This file is part of the Trixy crate for Trinitrix.
#
# Trixy is free software: you can redistribute it and/or modify
# it under the terms of the Lesser GNU General Public License as
# published by the Free Software Foundation, either version 3 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# and the Lesser GNU General Public License along with this program.
# If not, see <https://www.gnu.org/licenses/>.
{
  description = "A rust crate used to generate multi-language apis for your
        application";
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";

    # inputs for following
    flake-compat = {
      url = "github:edolstra/flake-compat";
      flake = false;
    };

    treefmt-nix = {
      url = "github:numtide/treefmt-nix";
      inputs = {
        nixpkgs.follows = "nixpkgs";
      };
    };

    systems = {
      url = "github:nix-systems/default";
    };

    crane = {
      url = "github:ipetkov/crane";
      inputs = {
        nixpkgs.follows = "nixpkgs";
      };
    };
    flake-utils = {
      url = "github:numtide/flake-utils";
      inputs = {
        systems.follows = "systems";
      };
    };
    rust-overlay = {
      url = "github:oxalica/rust-overlay";
      inputs = {
        nixpkgs.follows = "nixpkgs";
      };
    };

    ebnf2pdf = {
      url = "git+https://codeberg.org/bpeetz/ebnf2pdf.git";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        flake-utils.follows = "flake-utils";
        flake-compat.follows = "flake-compat";
        systems.follows = "systems";
      };
    };
  };
  outputs = {
    self,
    nixpkgs,
    crane,
    flake-utils,
    rust-overlay,
    ebnf2pdf,
    treefmt-nix,
    ...
  }:
    flake-utils.lib.eachDefaultSystem (system: let
      pkgs = import nixpkgs {
        inherit system;
        overlays = [(import rust-overlay)];
      };

      nightly = false;
      rust =
        if nightly
        then
          (pkgs.rust-bin.selectLatestNightlyWith (toolchain:
              toolchain.default))
          .override {
            extensions = ["rustc-codegen-cranelift-preview"];
          }
        else pkgs.rust-bin.stable.latest.default;
      rust_min =
        if nightly
        then
          (pkgs.rust-bin.selectLatestNightlyWith (toolchain:
              toolchain.minimal))
          .override {
            extensions = ["rustc-codegen-cranelift-preview"];
          }
        else pkgs.rust-bin.stable.latest.minimal;

      craneLib = (crane.mkLib pkgs).overrideToolchain rust_min;

      nativeBuildInputs = with pkgs; [
        pkg-config
      ];
      buildInputs = with pkgs; [
        lua54Packages.lua
      ];

      craneBuild = craneLib.buildPackage {
        src = craneLib.cleanCargoSource ./.;

        doCheck = true;
        inherit nativeBuildInputs buildInputs;
      };
      treefmtEval = treefmt-nix.lib.evalModule pkgs (
        {pkgs, ...}: {
          # Used to find the project root
          projectRootFile = "flake.nix";

          programs = {
            alejandra.enable = true;
            rustfmt.enable = true;
            clang-format.enable = true;
            mdformat.enable = true;
            shfmt = {
              enable = true;
              indent_size = 4;
            };
            shellcheck.enable = true;
            # prettier = {
            #   settings = {
            #     arrowParens = "always";
            #     bracketSameLine = false;
            #     bracketSpacing = true;
            #     editorconfig = true;
            #     embeddedLanguageFormatting = "auto";
            #     endOfLine = "lf";
            #     # experimentalTernaries = false;
            #     htmlWhitespaceSensitivity = "css";
            #     insertPragma = false;
            #     jsxSingleQuote = true;
            #     printWidth = 80;
            #     proseWrap = "always";
            #     quoteProps = "consistent";
            #     requirePragma = false;
            #     semi = true;
            #     singleAttributePerLine = true;
            #     singleQuote = true;
            #     trailingComma = "all";
            #     useTabs = false;
            #     vueIndentScriptAndStyle = false;
            #
            #     tabWidth = 4;
            #     overrides = {
            #       files = ["*.js"];
            #       options.tabwidth = 2;
            #     };
            #   };
            # };
            stylua.enable = true;
            ruff = {
              enable = true;
              format = true;
            };
            taplo.enable = true;
            yamlfmt.enable = true;
          };

          settings = {
            global.excludes = ["NEWS.md"];
            formatter = {
              clang-format = {
                options = ["--style" "GNU"];
              };
              shfmt = {
                includes = ["*.bash"];
              };
              rustfmt = {
                # also add the Trixy files
                includes = ["*.tri"];
              };
            };
          };
        }
      );
    in {
      checks.default = craneBuild;
      packages = {
        default = craneBuild;
      };

      formatter = treefmtEval.config.build.wrapper;
      checks = {
        formatting = treefmtEval.config.build.check self;
      };

      devShells.default = pkgs.mkShell {
        packages = with pkgs; [
          alejandra

          cocogitto
          licensure
          treefmt

          rust
          cargo-edit
          cargo-expand
          valgrind

          # Used to format the c header files
          libclang
          gdb

          ebnf2pdf.outputs.packages."${system}".default

          # for the ./scripts/renew_copyright_header.sh
          yq
        ];
        inherit nativeBuildInputs buildInputs;
      };
    });
}