From a4bdbe5618f5a35c17d6a9e7e6bd55df2e01a9da Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Thu, 8 Feb 2024 16:58:45 +0100 Subject: [PATCH] feat: Rust skeleton (cherry picked from commit 41a09289cda3137f96c69c69c924af34f0e64865) --- .envrc | 1 + .gitignore | 12 +++ .vscode/extensions.json | 6 ++ .vscode/settings.json | 4 + README.md | 6 ++ flake.lock | 226 ++++++++++++++++++++++++++++++++++++---- flake.nix | 21 +++- rust/Cargo.toml | 4 + rust/nci.nix | 6 ++ 9 files changed, 264 insertions(+), 22 deletions(-) create mode 100644 .envrc create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 rust/Cargo.toml create mode 100644 rust/nci.nix diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/.gitignore b/.gitignore index 5bc3ddd..f5a46ae 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +# direnv +.direnv # Nix result @@ -5,3 +7,13 @@ result-* # pre-commit .pre-commit-config.yaml + +# Rust +**/target + +# VSCode +# We have an opinionated setup for VSCode, so we want to keep the settings in the repo. +!.vscode +!.vscode/settings.json +# Extension recommendations should be kept in the repo. +!.vscode/extensions.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..f44d85f --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + "recommendations": [ + "rust-lang.rust", + "mkhl.direnv" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..4022d6d --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + // Take from PATH, direnv + "rust-analyzer.server.path": "rust-analyzer" +} \ No newline at end of file diff --git a/README.md b/README.md index 49dbb7e..aa5eb40 100644 --- a/README.md +++ b/README.md @@ -11,4 +11,10 @@ The following will open a shell with dependencies, and install pre-commit for au $ nix develop ``` +### VSCode + +#### rust-analyzer + +If the rust-analyzer extension fails, make sure the devShell was loaded into VSCode via Nix Env Selector or direnv. + [C API]: https://nix.dev/manual/nix/latest/c-api.html diff --git a/flake.lock b/flake.lock index d7dfcd5..fd80b32 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,45 @@ { "nodes": { + "crane": { + "flake": false, + "locked": { + "lastModified": 1699217310, + "narHash": "sha256-xpW3VFUG7yE6UE6Wl0dhqencuENSkV7qpnpe9I8VbPw=", + "owner": "ipetkov", + "repo": "crane", + "rev": "d535642bbe6f377077f7c23f0febb78b1463f449", + "type": "github" + }, + "original": { + "owner": "ipetkov", + "ref": "v0.15.0", + "repo": "crane", + "type": "github" + } + }, + "dream2nix": { + "inputs": { + "nixpkgs": [ + "nix-cargo-integration", + "nixpkgs" + ], + "purescript-overlay": "purescript-overlay", + "pyproject-nix": "pyproject-nix" + }, + "locked": { + "lastModified": 1707223475, + "narHash": "sha256-tDmoPA3gukJPfjR/pKl6hNcRP7cuEGw6ruoguHS4szo=", + "owner": "nix-community", + "repo": "dream2nix", + "rev": "936208ae7d88a178a0bcf7e6ac21bb6b87f6c8ea", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "dream2nix", + "type": "github" + } + }, "flake-compat": { "flake": false, "locked": { @@ -18,7 +58,9 @@ }, "flake-parts": { "inputs": { - "nixpkgs-lib": "nixpkgs-lib" + "nixpkgs-lib": [ + "nixpkgs" + ] }, "locked": { "lastModified": 1706830856, @@ -73,6 +115,48 @@ "type": "github" } }, + "mk-naked-shell": { + "flake": false, + "locked": { + "lastModified": 1681286841, + "narHash": "sha256-3XlJrwlR0nBiREnuogoa5i1b4+w/XPe0z8bbrJASw0g=", + "owner": "yusdacra", + "repo": "mk-naked-shell", + "rev": "7612f828dd6f22b7fb332cc69440e839d7ffe6bd", + "type": "github" + }, + "original": { + "owner": "yusdacra", + "repo": "mk-naked-shell", + "type": "github" + } + }, + "nix-cargo-integration": { + "inputs": { + "crane": "crane", + "dream2nix": "dream2nix", + "mk-naked-shell": "mk-naked-shell", + "nixpkgs": [ + "nixpkgs" + ], + "parts": "parts", + "rust-overlay": "rust-overlay", + "treefmt": "treefmt" + }, + "locked": { + "lastModified": 1707372711, + "narHash": "sha256-VixqzHPc4VGd3TVcdTSufrpZ6wequ0a8BGSQOuxaFps=", + "owner": "yusdacra", + "repo": "nix-cargo-integration", + "rev": "eddee765f67966646c487f554fc843e8513aad28", + "type": "github" + }, + "original": { + "owner": "yusdacra", + "repo": "nix-cargo-integration", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1707092692, @@ -89,24 +173,6 @@ "type": "github" } }, - "nixpkgs-lib": { - "locked": { - "dir": "lib", - "lastModified": 1706550542, - "narHash": "sha256-UcsnCG6wx++23yeER4Hg18CXWbgNpqNXcHIo5/1Y+hc=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "97b17f32362e475016f942bbdfda4a4a72a8a652", - "type": "github" - }, - "original": { - "dir": "lib", - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, "nixpkgs-stable": { "locked": { "lastModified": 1704874635, @@ -123,6 +189,27 @@ "type": "github" } }, + "parts": { + "inputs": { + "nixpkgs-lib": [ + "nix-cargo-integration", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1706830856, + "narHash": "sha256-a0NYyp+h9hlb7ddVz4LUn1vT/PLwqfrWYcHMvFB1xYg=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "b253292d9c0a5ead9bc98c4e9a26c6312e27d69f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, "pre-commit-hooks-nix": { "inputs": { "flake-compat": "flake-compat", @@ -147,13 +234,93 @@ "type": "github" } }, + "purescript-overlay": { + "inputs": { + "nixpkgs": [ + "nix-cargo-integration", + "dream2nix", + "nixpkgs" + ], + "slimlock": "slimlock" + }, + "locked": { + "lastModified": 1696022621, + "narHash": "sha256-eMjFmsj2G1E0Q5XiibUNgFjTiSz0GxIeSSzzVdoN730=", + "owner": "thomashoneyman", + "repo": "purescript-overlay", + "rev": "047c7933abd6da8aa239904422e22d190ce55ead", + "type": "github" + }, + "original": { + "owner": "thomashoneyman", + "repo": "purescript-overlay", + "type": "github" + } + }, + "pyproject-nix": { + "flake": false, + "locked": { + "lastModified": 1702448246, + "narHash": "sha256-hFg5s/hoJFv7tDpiGvEvXP0UfFvFEDgTdyHIjDVHu1I=", + "owner": "davhau", + "repo": "pyproject.nix", + "rev": "5a06a2697b228c04dd2f35659b4b659ca74f7aeb", + "type": "github" + }, + "original": { + "owner": "davhau", + "ref": "dream2nix", + "repo": "pyproject.nix", + "type": "github" + } + }, "root": { "inputs": { "flake-parts": "flake-parts", + "nix-cargo-integration": "nix-cargo-integration", "nixpkgs": "nixpkgs", "pre-commit-hooks-nix": "pre-commit-hooks-nix" } }, + "rust-overlay": { + "flake": false, + "locked": { + "lastModified": 1707358215, + "narHash": "sha256-Nuhi8KEJ2e+2nTimSyEIPqN5eh7ECVWd+AnPXG6L+SY=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "dd917bb1b67fc049fd56fe6de70266a9ab74a4aa", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "slimlock": { + "inputs": { + "nixpkgs": [ + "nix-cargo-integration", + "dream2nix", + "purescript-overlay", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1688610262, + "narHash": "sha256-Wg0ViDotFWGWqKIQzyYCgayeH8s4U1OZcTiWTQYdAp4=", + "owner": "thomashoneyman", + "repo": "slimlock", + "rev": "b5c6cdcaf636ebbebd0a1f32520929394493f1a6", + "type": "github" + }, + "original": { + "owner": "thomashoneyman", + "repo": "slimlock", + "type": "github" + } + }, "systems": { "locked": { "lastModified": 1681028828, @@ -168,6 +335,27 @@ "repo": "default", "type": "github" } + }, + "treefmt": { + "inputs": { + "nixpkgs": [ + "nix-cargo-integration", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1707300477, + "narHash": "sha256-qQF0fEkHlnxHcrKIMRzOETnRBksUK048MXkX0SOmxvA=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "ac599dab59a66304eb511af07b3883114f061b9d", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 23d86be..6268571 100644 --- a/flake.nix +++ b/flake.nix @@ -3,7 +3,9 @@ inputs = { flake-parts.url = "github:hercules-ci/flake-parts"; - flake-parts.inputs.nixpkgs.follows = "nixpkgs"; + flake-parts.inputs.nixpkgs-lib.follows = "nixpkgs"; + nix-cargo-integration.url = "github:yusdacra/nix-cargo-integration"; + nix-cargo-integration.inputs.nixpkgs.follows = "nixpkgs"; nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; pre-commit-hooks-nix.url = "github:cachix/pre-commit-hooks.nix"; pre-commit-hooks-nix.inputs.nixpkgs.follows = "nixpkgs"; @@ -12,14 +14,27 @@ outputs = inputs@{ self, flake-parts, ... }: flake-parts.lib.mkFlake { inherit inputs; } - { + ({ lib, ... }: { imports = [ inputs.pre-commit-hooks-nix.flakeModule + inputs.nix-cargo-integration.flakeModule + ./rust/nci.nix ]; systems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ]; perSystem = { config, self', inputs', pkgs, ... }: { + pre-commit.settings.hooks.nixpkgs-fmt.enable = true; + pre-commit.settings.hooks.rustfmt.enable = true; + # Override to pass `--all` + pre-commit.settings.hooks.rustfmt.entry = lib.mkForce "${pkgs.rustfmt}/bin/cargo-fmt fmt --all --manifest-path ./rust/Cargo.toml -- --color always"; + devShells.default = pkgs.mkShell { + inputsFrom = [ config.nci.outputs.nix-bindings.devShell ]; + nativeBuildInputs = [ + pkgs.rust-analyzer + pkgs.nixpkgs-fmt + pkgs.rustfmt + ]; shellHook = '' ${config.pre-commit.installationScript} echo 1>&2 "Welcome to the development shell!" @@ -27,5 +42,5 @@ }; }; flake = { }; - }; + }); } diff --git a/rust/Cargo.toml b/rust/Cargo.toml new file mode 100644 index 0000000..d21c77c --- /dev/null +++ b/rust/Cargo.toml @@ -0,0 +1,4 @@ +[workspace] +members = [ +] +resolver = "2" diff --git a/rust/nci.nix b/rust/nci.nix new file mode 100644 index 0000000..1fbaa3a --- /dev/null +++ b/rust/nci.nix @@ -0,0 +1,6 @@ +{ + perSystem = { pkgs, config, ... }: { + # https://flake.parts/options/nix-cargo-integration + nci.projects.nix-bindings.path = ./.; + }; +}