include-utils 0.2.2

mdBook-like include macro as the powerful replacement for the standard `include_str` macro.
Documentation
{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    rust-overlay = {
      url = "github:oxalica/rust-overlay";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    treefmt-nix.url = "github:numtide/treefmt-nix";
    flake-utils.url = "github:numtide/flake-utils";
  };

  outputs =
    { self
    , nixpkgs
    , flake-utils
    , rust-overlay
    , treefmt-nix
    }: flake-utils.lib.eachDefaultSystem (system:
    let
      # Setup nixpkgs
      pkgs = import nixpkgs {
        inherit system;

        overlays = [
          rust-overlay.overlays.default
          (final: prev: {
            rustToolchains = {
              stable = prev.rust-bin.stable.latest.default.override {
                extensions = [
                  "rust-src"
                  "rust-analyzer"
                ];
              };
              nightly = prev.rust-bin.nightly.latest.default;
            };
          })
        ];
      };
      # Setup runtime dependencies
      runtimeInputs = with pkgs; [
        rustToolchains.stable
        openssl.dev
        pkg-config
      ]
      # Some additional libraries for the Darwin platform
      ++ lib.optionals stdenv.isDarwin [
        darwin.apple_sdk.frameworks.SystemConfiguration
      ];

      # Eval the treefmt modules from ./treefmt.nix
      treefmt = (treefmt-nix.lib.evalModule pkgs ./treefmt.nix).config.build;
      # CI scripts
      ci = with pkgs; {
        tests = writeShellApplication {
          name = "ci-run-tests";
          inherit runtimeInputs;
          text = ''
            cargo test --workspace --all-features --all-targets
          '';
        };

        lints = writeShellApplication {
          name = "ci-run-lints";
          inherit runtimeInputs;
          text = ''
            cargo clippy --workspace --all-features --all --all-targets
            cargo doc --workspace --all-features  --no-deps
          '';
        };

        check_semver = writeShellApplication {
          name = "ci-check-semver";
          runtimeInputs = with pkgs; [ cargo-semver-checks ];
          text = ''cargo semver-checks'';
        };

        # Run them all together
        all = writeShellApplication {
          name = "ci-run-all";
          runtimeInputs = [ ci.lints ci.tests ];
          text = ''
            ci-run-tests
            ci-run-lints
          '';
        };
      };
    in
    {
      # for `nix fmt`
      formatter = treefmt.wrapper;
      # for `nix flake check`
      checks.formatting = treefmt.check self;

      devShells.default = pkgs.mkShell {
        nativeBuildInputs = runtimeInputs ++ [
          ci.all
          ci.lints
          ci.tests
          ci.check_semver
        ];
      };

      # Nightly compilator to run miri tests
      devShells.nightly = pkgs.mkShell {
        nativeBuildInputs = with pkgs; [
          rustToolchains.nightly
        ];
      };

      packages = {
        ci-lints = ci.lints;
        ci-tests = ci.tests;
        ci-all = ci.all;
        ci-check-semver = ci.check_semver;
      };
    });
}