From a359b483bdd8a9c115cbf659fa1615dee817a57a Mon Sep 17 00:00:00 2001 From: Kyle J Turpin Date: Tue, 15 Sep 2026 12:54:56 -0500 Subject: [PATCH] Initial template --- .editorconfig | 21 ++++++ .envrc | 2 + .gitignore | 10 +++ .pre-commit-config.yaml | 8 +++ CONTRIBUTING.md | 9 +++ Cargo.lock | 7 ++ Cargo.toml | 6 ++ LICENSE | 17 +++++ Makefile | 25 +++++++ agents.md | 16 +++++ default.nix | 27 +++++++ flake.nix | 151 +++++++++++++++++++++++++++++++++++++++ flatpak/app.flatpak.json | 22 ++++++ piggy | 0 project.toml | 6 ++ shell.nix | 13 ++++ src/main.rs | 3 + tests/sample_test.rs | 4 ++ 18 files changed, 347 insertions(+) create mode 100644 .editorconfig create mode 100644 .envrc create mode 100644 .gitignore create mode 100644 .pre-commit-config.yaml create mode 100644 CONTRIBUTING.md create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 agents.md create mode 100644 default.nix create mode 100644 flake.nix create mode 100644 flatpak/app.flatpak.json delete mode 100644 piggy create mode 100644 project.toml create mode 100644 shell.nix create mode 100644 src/main.rs create mode 100644 tests/sample_test.rs diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..584b76c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,21 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +end_of_line = lf + +[*.{c,h,cpp,hpp,cc,hh,cxx,hxx}] +indent_size = 4 + +[*.{java,scala,cs,fs,rs,go,py}] +indent_size = 4 + +[*.go] +indent_style = tab + +[Makefile] +indent_style = tab diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..ea35353 --- /dev/null +++ b/.envrc @@ -0,0 +1,2 @@ +# Direnv configuration for Nix flakes +use flake \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..12108df --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +# Rust build artifacts +/target/ + +# IDE +.vscode/ +.idea/ + +# Nix +result +.direnv/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..93d696f --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,8 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..a94fcb9 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,9 @@ +# Contributing + +Thank you for considering contributing! + +- Please follow the project coding style and directory structure. +- Submit issues or pull requests for bugs, features, or improvements. +- Add tests for new features where possible. +- Ensure your code builds and passes tests before submitting. +- Contributions are licensed under CC BY-SA 4.0. diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..6748e40 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "sample-rust-app" +version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..9e619e5 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "sample-rust-app" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..eae17d3 --- /dev/null +++ b/LICENSE @@ -0,0 +1,17 @@ +Creative Commons Attribution-ShareAlike 4.0 International + + + +You are free to: + +- Share — copy and redistribute the material in any medium or format +- Adapt — remix, transform, and build upon the material for any purpose, even commercially. + +Under the following terms: + +- Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. +- ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. + +See the full license at the link above. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..51c738f --- /dev/null +++ b/Makefile @@ -0,0 +1,25 @@ +build: + cargo build + +run: + cargo run + +test: + cargo test + +clean: + cargo clean + +.PHONY: build run test clean + + +# Flatpak build target +.PHONY: +# Standardized code quality targets +fmt format: + cargo fmt + +lint: + cargo clippy -- -D warnings 2>/dev/null || true + +check: fmt lint diff --git a/agents.md b/agents.md new file mode 100644 index 0000000..1bb9395 --- /dev/null +++ b/agents.md @@ -0,0 +1,16 @@ +# Coding Agent Instructions + +This project is intended for educational purposes. To support this, please adhere to the following guidelines: + +## Allowed Actions +- **Environment Maintenance:** Feel free to update Nix flakes, shell configurations, or other environment-related setup. +- **Project Housekeeping:** Maintain a standard project layout, keep `README.md` up-to-date, and clean up temporary or build-related files. +- **Documentation:** Add comments, manage project documentation, and add links to relevant external resources. + +## Restricted Actions +- **Source Code Editing:** You are NOT allowed to edit the executable source code (`src/` directory) except to improve documentation.. +- **Code Generation:** Do not provide example code unless explicitly asked by the user. + +## Communication Guidelines +- **Educational Focus:** When asked about code, prioritize explaining the concepts and providing advice over writing code. +- **Documentation Links:** Always include links to official language or library documentation for references. diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..fb4288d --- /dev/null +++ b/default.nix @@ -0,0 +1,27 @@ +{pkgs}: let + inherit (pkgs) lib; + templateName = builtins.baseNameOf (toString ./.); +in { + ${templateName} = pkgs.stdenvNoCC.mkDerivation { + pname = templateName; + version = "0.1.0"; + src = ./.; + dontBuild = true; + installPhase = '' + mkdir -p $out/share/${templateName} + if [ -d src ]; then + cp -r src $out/share/${templateName}/ + fi + for f in README.md project.toml flake.nix default.nix shell.nix Makefile .editorconfig .gitignore; do + if [ -f "$f" ]; then + cp "$f" $out/share/${templateName}/ + fi + done + ''; + meta = with lib; { + description = "Template project: ${templateName}"; + license = licenses.unfreeRedistributable; + platforms = platforms.all; + }; + }; +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..35ded4b --- /dev/null +++ b/flake.nix @@ -0,0 +1,151 @@ +{ + description = "A Nix-flake-based Rust development environment"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + fenix = { + url = "github:nix-community/fenix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + outputs = inputs @ {self, ...}: let + supportedSystems = [ + "x86_64-linux" + "aarch64-linux" + "aarch64-darwin" + ]; + forEachSupportedSystem = f: + inputs.nixpkgs.lib.genAttrs supportedSystems ( + system: + f { + pkgs = import inputs.nixpkgs { + inherit system; + overlays = [ + inputs.self.overlays.default + ]; + }; + } + ); + in { + formatter = forEachSupportedSystem ({pkgs}: pkgs.rustfmt); + + templates = { + default = { + path = ./.; + description = "Rust dev environment using fenix; includes a skeletal Cargo project and packaged helper app"; + }; + }; + + overlays.default = _final: prev: { + rustToolchain = with inputs.fenix.packages.${prev.stdenv.hostPlatform.system}; + combine ( + with stable; [ + clippy + rustc + cargo + rustfmt + rust-src + ] + ); + }; + + devShells = forEachSupportedSystem ( + {pkgs}: { + default = pkgs.mkShell { + packages = with pkgs; [ + rustToolchain + git + gnumake + alejandra + statix + deadnix + editorconfig-checker + openssl + pkg-config + cargo-deny + cargo-edit + cargo-watch + cargo-generate + rust-analyzer + rustup + # Embedded Rust tooling + probe-rs-tools + espflash + openocd + minicom + # RP2040 UF2 workflows + elf2uf2-rs + picotool + avrdude + pkgsCross.avr.buildPackages.libc + pkgsCross.avr.buildPackages.gcc + ravedude + pre-commit + ]; + + env = { + # Required by rust-analyzer + RUST_SRC_PATH = "${pkgs.rustToolchain}/lib/rustlib/src/rust/library"; + }; + + shellHook = '' + # Initialize git repository if not already present + if [ ! -d .git ]; then + git init + echo "✓ Initialized git repository" + fi + + # Ensure user's Cargo-installed binaries are available + export PATH="$HOME/.cargo/bin:$PATH" + + if command -v rustup >/dev/null 2>&1; then + echo "Ensuring common embedded Rust targets are available (idempotent)..." + rustup target add thumbv6m-none-eabi >/dev/null 2>&1 || true # Cortex-M0/M0+ (RP2040) + rustup target add thumbv7em-none-eabihf >/dev/null 2>&1 || true # Cortex-M4F/M7F (many STM32/nRF52) + rustup target add riscv32imc-unknown-none-elf >/dev/null 2>&1 || true + rustup target add riscv32imac-unknown-none-elf >/dev/null 2>&1 || true # ESP32-C3 class + echo "Note: ESP32 Xtensa targets require espup/custom toolchains (see esp-rs)." + fi + echo "[rust-template] Welcome to the Rust dev shell!" + echo "Tools: cargo, rustc, clippy, rustfmt, rust-analyzer, probe-rs, espflash, openocd, minicom, elf2uf2-rs, picotool, avrdude, ravedude" + echo "Run 'cargo build' to build, or 'nix run .#dev-helper' for a tool summary." + echo "See README.md for usage." + ''; + }; + } + ); + + packages = forEachSupportedSystem ( + {pkgs}: { + # Build the skeletal Cargo project + default = pkgs.rustPlatform.buildRustPackage { + pname = "sample-rust-app"; + version = "0.1.0"; + src = ./.; + cargoLock.lockFile = ./Cargo.lock; + }; + + devHelper = pkgs.writeShellScriptBin "dev-helper" '' + echo "Rust toolchain available:" + command -v cargo >/dev/null 2>&1 && cargo --version || true + command -v rustc >/dev/null 2>&1 && rustc --version || true + echo "This binary is built by Nix (packages.default)." + ''; + } + ); + + apps = forEachSupportedSystem ( + {pkgs}: { + default = { + type = "app"; + program = pkgs.lib.getExe self.packages.${pkgs.stdenv.hostPlatform.system}.default; + }; + dev-helper = { + type = "app"; + program = pkgs.lib.getExe self.packages.${pkgs.stdenv.hostPlatform.system}.devHelper; + }; + } + ); + }; +} diff --git a/flatpak/app.flatpak.json b/flatpak/app.flatpak.json new file mode 100644 index 0000000..c4e609c --- /dev/null +++ b/flatpak/app.flatpak.json @@ -0,0 +1,22 @@ +{ + "app-id": "org.example.rustdevshell", + "runtime": "org.freedesktop.Platform", + "runtime-version": "23.08", + "sdk": "org.freedesktop.Sdk", + "command": "rustdevshell-app", + "modules": [ + { + "name": "rustdevshell-app", + "buildsystem": "simple", + "build-commands": [ + "cargo build --release" + ], + "sources": [ + { + "type": "dir", + "path": ".." + } + ] + } + ] +} \ No newline at end of file diff --git a/piggy b/piggy deleted file mode 100644 index e69de29..0000000 diff --git a/project.toml b/project.toml new file mode 100644 index 0000000..47f6547 --- /dev/null +++ b/project.toml @@ -0,0 +1,6 @@ +[project] +name = "rust-template" +description = "A reusable Nix flake template for Rust development." +version = "0.1.0" +authors = ["gooba42 "] +license = "MIT" diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..4d9931a --- /dev/null +++ b/shell.nix @@ -0,0 +1,13 @@ +{pkgs ? import {}}: +pkgs.mkShell { + buildInputs = [ + pkgs.rustc + pkgs.cargo + pkgs.rustfmt + pkgs.clippy + pkgs.rust-analyzer + ]; + shellHook = '' + echo "[shell.nix] Legacy shell for Rust dev. Use 'nix develop' for full flake support." + ''; +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..c1b53ae --- /dev/null +++ b/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello from Rust skeletal app. Edit src/main.rs to get started!"); +} diff --git a/tests/sample_test.rs b/tests/sample_test.rs new file mode 100644 index 0000000..7c050df --- /dev/null +++ b/tests/sample_test.rs @@ -0,0 +1,4 @@ +#[test] +fn test_sample() { + assert_eq!(1, 1); +}