init
This commit is contained in:
6
.envrc.project
Normal file
6
.envrc.project
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# for direnv (https://direnv.net/)
|
||||||
|
# create a .envrc symlink to this file or copy its contents to .envrc
|
||||||
|
# then run `direnv allow` to enable
|
||||||
|
|
||||||
|
use flake
|
||||||
|
dotenv_if_exists
|
||||||
46
.github/README.md
vendored
Normal file
46
.github/README.md
vendored
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
# zig template
|
||||||
|
|
||||||
|
[](https://github.com/spotdemo4/zig-template/actions/workflows/check.yaml)
|
||||||
|
[](https://github.com/spotdemo4/zig-template/actions/workflows/vulnerable.yaml)
|
||||||
|
[](https://nixos.org/)
|
||||||
|
[%22&replace=%241&logo=zig&logoColor=%23bac2de&label=zig&labelColor=%23313244&color=%23F7A41D>)](https://ziglang.org/)
|
||||||
|
|
||||||
|
template for [zig](https://ziglang.org/)
|
||||||
|
|
||||||
|
part of [spotdemo4/templates](https://github.com/spotdemo4/templates)
|
||||||
|
|
||||||
|
## requirements
|
||||||
|
|
||||||
|
- [nix](https://nixos.org/)
|
||||||
|
- [direnv](https://direnv.net/) (optional)
|
||||||
|
|
||||||
|
## getting started
|
||||||
|
|
||||||
|
initialize direnv:
|
||||||
|
|
||||||
|
```elm
|
||||||
|
ln -s .envrc.project .envrc &&
|
||||||
|
direnv allow
|
||||||
|
```
|
||||||
|
|
||||||
|
or manually enter the development environment:
|
||||||
|
|
||||||
|
```elm
|
||||||
|
nix develop
|
||||||
|
```
|
||||||
|
|
||||||
|
### check
|
||||||
|
|
||||||
|
```elm
|
||||||
|
nix flake check
|
||||||
|
```
|
||||||
|
|
||||||
|
### release
|
||||||
|
|
||||||
|
releases are automatically created for [significant](https://www.conventionalcommits.org/en/v1.0.0/#summary) changes
|
||||||
|
|
||||||
|
to manually create a version bump:
|
||||||
|
|
||||||
|
```elm
|
||||||
|
bumper
|
||||||
|
```
|
||||||
34
.github/renovate.json
vendored
Normal file
34
.github/renovate.json
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://docs.renovatebot.com/renovate-global-schema.json",
|
||||||
|
|
||||||
|
// self-hosted
|
||||||
|
"onboarding": false,
|
||||||
|
"requireConfig": "ignored",
|
||||||
|
"platform": "github",
|
||||||
|
"repositories": ["spotdemo4/zig-template"],
|
||||||
|
|
||||||
|
// repository
|
||||||
|
"extends": ["config:recommended"],
|
||||||
|
"lockFileMaintenance": {
|
||||||
|
"enabled": true,
|
||||||
|
"automerge": true,
|
||||||
|
"schedule": ["* * * * 0"] // sunday
|
||||||
|
},
|
||||||
|
"nix": {
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
"packageRules": [
|
||||||
|
{
|
||||||
|
"matchUpdateTypes": ["minor", "patch", "pin", "digest"],
|
||||||
|
"automerge": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"matchManagers": ["nix"],
|
||||||
|
"groupName": "nix inputs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"matchManagers": ["github-actions"],
|
||||||
|
"groupName": "github actions"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
39
.github/workflows/bump.yaml
vendored
Normal file
39
.github/workflows/bump.yaml
vendored
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
name: bump
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 22 * * 1-5" # every weekday at 22:00 UTC
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
force:
|
||||||
|
description: "force"
|
||||||
|
required: false
|
||||||
|
type: choice
|
||||||
|
default: "true"
|
||||||
|
options:
|
||||||
|
- "true"
|
||||||
|
- "false"
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: release
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
bump:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: spotdemo4/nix-init@5fe5a93e1ff2a6a4cfba1ae7d3f30d0dfed9d1a9 # v1.34.1
|
||||||
|
with:
|
||||||
|
app_id: ${{ vars.CLIENT_ID }}
|
||||||
|
app_key: ${{ secrets.PRIVATE_KEY }}
|
||||||
|
fetch_depth: 0
|
||||||
|
shell: bump
|
||||||
|
|
||||||
|
- name: Bump
|
||||||
|
run: bumper
|
||||||
|
env:
|
||||||
|
FORCE: ${{ inputs.force }}
|
||||||
25
.github/workflows/check.yaml
vendored
Normal file
25
.github/workflows/check.yaml
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
name: check
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches: ["main"]
|
||||||
|
push:
|
||||||
|
branches: ["main"]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.head_ref }}
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: spotdemo4/nix-init@5fe5a93e1ff2a6a4cfba1ae7d3f30d0dfed9d1a9 # v1.34.1
|
||||||
|
|
||||||
|
- name: Check
|
||||||
|
run: nix flake check
|
||||||
35
.github/workflows/release.yaml
vendored
Normal file
35
.github/workflows/release.yaml
vendored
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
name: release
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags: ["v*"]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: release
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
id-token: write
|
||||||
|
packages: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- id: checkout
|
||||||
|
name: Checkout
|
||||||
|
uses: spotdemo4/nix-init@5fe5a93e1ff2a6a4cfba1ae7d3f30d0dfed9d1a9 # v1.34.1
|
||||||
|
with:
|
||||||
|
app_id: ${{ vars.CLIENT_ID }}
|
||||||
|
app_key: ${{ secrets.PRIVATE_KEY }}
|
||||||
|
fetch_depth: 0
|
||||||
|
shell: release
|
||||||
|
|
||||||
|
- name: Release
|
||||||
|
run: flake-release
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ steps.checkout.outputs.token }}
|
||||||
|
REGISTRY: ghcr.io
|
||||||
|
REGISTRY_USERNAME: ${{ github.actor }}
|
||||||
|
REGISTRY_PASSWORD: ${{ secrets.GITHUB_TOKEN }}
|
||||||
29
.github/workflows/update.yaml
vendored
Normal file
29
.github/workflows/update.yaml
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
name: update
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 9 * * *" # every day at 09:00 UTC
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
renovate:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- id: checkout
|
||||||
|
name: Checkout
|
||||||
|
uses: spotdemo4/nix-init@5fe5a93e1ff2a6a4cfba1ae7d3f30d0dfed9d1a9 # v1.34.1
|
||||||
|
with:
|
||||||
|
app_id: ${{ vars.CLIENT_ID }}
|
||||||
|
app_key: ${{ secrets.PRIVATE_KEY }}
|
||||||
|
shell: update
|
||||||
|
|
||||||
|
- name: Renovate
|
||||||
|
run: renovate
|
||||||
|
env:
|
||||||
|
RENOVATE_CONFIG_FILE: .github/renovate.json
|
||||||
|
RENOVATE_TOKEN: ${{ steps.checkout.outputs.token }}
|
||||||
|
LOG_LEVEL: ${{ runner.debug == '1' && 'debug' || 'info' }}
|
||||||
33
.github/workflows/vulnerable.yaml
vendored
Normal file
33
.github/workflows/vulnerable.yaml
vendored
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
name: vulnerable
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 9 * * 0" # every Sunday at 09:00 UTC
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
flake:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: spotdemo4/nix-init@5fe5a93e1ff2a6a4cfba1ae7d3f30d0dfed9d1a9 # v1.34.1
|
||||||
|
with:
|
||||||
|
shell: vulnerable
|
||||||
|
|
||||||
|
- name: Run flake-checker
|
||||||
|
run: flake-checker -f
|
||||||
|
|
||||||
|
actions:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: spotdemo4/nix-init@5fe5a93e1ff2a6a4cfba1ae7d3f30d0dfed9d1a9 # v1.34.1
|
||||||
|
with:
|
||||||
|
shell: vulnerable
|
||||||
|
|
||||||
|
- name: Run octoscan
|
||||||
|
run: find .github/workflows -exec octoscan scan {} \;
|
||||||
11
.gitignore
vendored
Normal file
11
.gitignore
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
/.env
|
||||||
|
/.envrc
|
||||||
|
/docker-compose*
|
||||||
|
|
||||||
|
# zig
|
||||||
|
/zig-out/
|
||||||
|
/.zig-cache/
|
||||||
|
|
||||||
|
# nix
|
||||||
|
/result*
|
||||||
|
/.direnv/
|
||||||
7
.vscode/extensions.json
vendored
Normal file
7
.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
"ziglang.vscode-zig",
|
||||||
|
"jnoortheen.nix-ide",
|
||||||
|
"esbenp.prettier-vscode"
|
||||||
|
]
|
||||||
|
}
|
||||||
23
.vscode/settings.json
vendored
Normal file
23
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"editor.formatOnSave": true,
|
||||||
|
"files.associations": {
|
||||||
|
"renovate.json": "jsonc",
|
||||||
|
".envrc.project": "dotenv",
|
||||||
|
".envrc": "dotenv"
|
||||||
|
},
|
||||||
|
|
||||||
|
// nix
|
||||||
|
"nix.enableLanguageServer": true,
|
||||||
|
"nix.serverPath": "nixd",
|
||||||
|
"[nix]": {
|
||||||
|
"editor.defaultFormatter": "jnoortheen.nix-ide"
|
||||||
|
},
|
||||||
|
|
||||||
|
// json
|
||||||
|
"json.schemaDownload.trustedDomains": {
|
||||||
|
"https://docs.renovatebot.com/": true
|
||||||
|
},
|
||||||
|
|
||||||
|
// actions
|
||||||
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
|
}
|
||||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2026 trev
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
156
build.zig
Normal file
156
build.zig
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
const std = @import("std");
|
||||||
|
|
||||||
|
// Although this function looks imperative, it does not perform the build
|
||||||
|
// directly and instead it mutates the build graph (`b`) that will be then
|
||||||
|
// executed by an external runner. The functions in `std.Build` implement a DSL
|
||||||
|
// for defining build steps and express dependencies between them, allowing the
|
||||||
|
// build runner to parallelize the build automatically (and the cache system to
|
||||||
|
// know when a step doesn't need to be re-run).
|
||||||
|
pub fn build(b: *std.Build) void {
|
||||||
|
// Standard target options allow the person running `zig build` to choose
|
||||||
|
// what target to build for. Here we do not override the defaults, which
|
||||||
|
// means any target is allowed, and the default is native. Other options
|
||||||
|
// for restricting supported target set are available.
|
||||||
|
const target = b.standardTargetOptions(.{});
|
||||||
|
// Standard optimization options allow the person running `zig build` to select
|
||||||
|
// between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. Here we do not
|
||||||
|
// set a preferred release mode, allowing the user to decide how to optimize.
|
||||||
|
const optimize = b.standardOptimizeOption(.{});
|
||||||
|
// It's also possible to define more custom flags to toggle optional features
|
||||||
|
// of this build script using `b.option()`. All defined flags (including
|
||||||
|
// target and optimize options) will be listed when running `zig build --help`
|
||||||
|
// in this directory.
|
||||||
|
|
||||||
|
// This creates a module, which represents a collection of source files alongside
|
||||||
|
// some compilation options, such as optimization mode and linked system libraries.
|
||||||
|
// Zig modules are the preferred way of making Zig code available to consumers.
|
||||||
|
// addModule defines a module that we intend to make available for importing
|
||||||
|
// to our consumers. We must give it a name because a Zig package can expose
|
||||||
|
// multiple modules and consumers will need to be able to specify which
|
||||||
|
// module they want to access.
|
||||||
|
const mod = b.addModule("zig_template", .{
|
||||||
|
// The root source file is the "entry point" of this module. Users of
|
||||||
|
// this module will only be able to access public declarations contained
|
||||||
|
// in this file, which means that if you have declarations that you
|
||||||
|
// intend to expose to consumers that were defined in other files part
|
||||||
|
// of this module, you will have to make sure to re-export them from
|
||||||
|
// the root file.
|
||||||
|
.root_source_file = b.path("src/root.zig"),
|
||||||
|
// Later on we'll use this module as the root module of a test executable
|
||||||
|
// which requires us to specify a target.
|
||||||
|
.target = target,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Here we define an executable. An executable needs to have a root module
|
||||||
|
// which needs to expose a `main` function. While we could add a main function
|
||||||
|
// to the module defined above, it's sometimes preferable to split business
|
||||||
|
// logic and the CLI into two separate modules.
|
||||||
|
//
|
||||||
|
// If your goal is to create a Zig library for others to use, consider if
|
||||||
|
// it might benefit from also exposing a CLI tool. A parser library for a
|
||||||
|
// data serialization format could also bundle a CLI syntax checker, for example.
|
||||||
|
//
|
||||||
|
// If instead your goal is to create an executable, consider if users might
|
||||||
|
// be interested in also being able to embed the core functionality of your
|
||||||
|
// program in their own executable in order to avoid the overhead involved in
|
||||||
|
// subprocessing your CLI tool.
|
||||||
|
//
|
||||||
|
// If neither case applies to you, feel free to delete the declaration you
|
||||||
|
// don't need and to put everything under a single module.
|
||||||
|
const exe = b.addExecutable(.{
|
||||||
|
.name = "zig_template",
|
||||||
|
.root_module = b.createModule(.{
|
||||||
|
// b.createModule defines a new module just like b.addModule but,
|
||||||
|
// unlike b.addModule, it does not expose the module to consumers of
|
||||||
|
// this package, which is why in this case we don't have to give it a name.
|
||||||
|
.root_source_file = b.path("src/main.zig"),
|
||||||
|
// Target and optimization levels must be explicitly wired in when
|
||||||
|
// defining an executable or library (in the root module), and you
|
||||||
|
// can also hardcode a specific target for an executable or library
|
||||||
|
// definition if desireable (e.g. firmware for embedded devices).
|
||||||
|
.target = target,
|
||||||
|
.optimize = optimize,
|
||||||
|
// List of modules available for import in source files part of the
|
||||||
|
// root module.
|
||||||
|
.imports = &.{
|
||||||
|
// Here "zig_template" is the name you will use in your source code to
|
||||||
|
// import this module (e.g. `@import("zig_template")`). The name is
|
||||||
|
// repeated because you are allowed to rename your imports, which
|
||||||
|
// can be extremely useful in case of collisions (which can happen
|
||||||
|
// importing modules from different packages).
|
||||||
|
.{ .name = "zig_template", .module = mod },
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
// This declares intent for the executable to be installed into the
|
||||||
|
// install prefix when running `zig build` (i.e. when executing the default
|
||||||
|
// step). By default the install prefix is `zig-out/` but can be overridden
|
||||||
|
// by passing `--prefix` or `-p`.
|
||||||
|
b.installArtifact(exe);
|
||||||
|
|
||||||
|
// This creates a top level step. Top level steps have a name and can be
|
||||||
|
// invoked by name when running `zig build` (e.g. `zig build run`).
|
||||||
|
// This will evaluate the `run` step rather than the default step.
|
||||||
|
// For a top level step to actually do something, it must depend on other
|
||||||
|
// steps (e.g. a Run step, as we will see in a moment).
|
||||||
|
const run_step = b.step("run", "Run the app");
|
||||||
|
|
||||||
|
// This creates a RunArtifact step in the build graph. A RunArtifact step
|
||||||
|
// invokes an executable compiled by Zig. Steps will only be executed by the
|
||||||
|
// runner if invoked directly by the user (in the case of top level steps)
|
||||||
|
// or if another step depends on it, so it's up to you to define when and
|
||||||
|
// how this Run step will be executed. In our case we want to run it when
|
||||||
|
// the user runs `zig build run`, so we create a dependency link.
|
||||||
|
const run_cmd = b.addRunArtifact(exe);
|
||||||
|
run_step.dependOn(&run_cmd.step);
|
||||||
|
|
||||||
|
// By making the run step depend on the default step, it will be run from the
|
||||||
|
// installation directory rather than directly from within the cache directory.
|
||||||
|
run_cmd.step.dependOn(b.getInstallStep());
|
||||||
|
|
||||||
|
// This allows the user to pass arguments to the application in the build
|
||||||
|
// command itself, like this: `zig build run -- arg1 arg2 etc`
|
||||||
|
if (b.args) |args| {
|
||||||
|
run_cmd.addArgs(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Creates an executable that will run `test` blocks from the provided module.
|
||||||
|
// Here `mod` needs to define a target, which is why earlier we made sure to
|
||||||
|
// set the releative field.
|
||||||
|
const mod_tests = b.addTest(.{
|
||||||
|
.root_module = mod,
|
||||||
|
});
|
||||||
|
|
||||||
|
// A run step that will run the test executable.
|
||||||
|
const run_mod_tests = b.addRunArtifact(mod_tests);
|
||||||
|
|
||||||
|
// Creates an executable that will run `test` blocks from the executable's
|
||||||
|
// root module. Note that test executables only test one module at a time,
|
||||||
|
// hence why we have to create two separate ones.
|
||||||
|
const exe_tests = b.addTest(.{
|
||||||
|
.root_module = exe.root_module,
|
||||||
|
});
|
||||||
|
|
||||||
|
// A run step that will run the second test executable.
|
||||||
|
const run_exe_tests = b.addRunArtifact(exe_tests);
|
||||||
|
|
||||||
|
// A top level step for running all tests. dependOn can be called multiple
|
||||||
|
// times and since the two run steps do not depend on one another, this will
|
||||||
|
// make the two of them run in parallel.
|
||||||
|
const test_step = b.step("test", "Run tests");
|
||||||
|
test_step.dependOn(&run_mod_tests.step);
|
||||||
|
test_step.dependOn(&run_exe_tests.step);
|
||||||
|
|
||||||
|
// Just like flags, top level steps are also listed in the `--help` menu.
|
||||||
|
//
|
||||||
|
// The Zig build system is entirely implemented in userland, which means
|
||||||
|
// that it cannot hook into private compiler APIs. All compilation work
|
||||||
|
// orchestrated by the build system will result in other Zig compiler
|
||||||
|
// subcommands being invoked with the right flags defined. You can observe
|
||||||
|
// these invocations when one fails (or you pass a flag to increase
|
||||||
|
// verbosity) to validate assumptions and diagnose problems.
|
||||||
|
//
|
||||||
|
// Lastly, the Zig build system is relatively simple and self-contained,
|
||||||
|
// and reading its source code will allow you to master it.
|
||||||
|
}
|
||||||
80
build.zig.zon
Normal file
80
build.zig.zon
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
.{
|
||||||
|
// This is the default name used by packages depending on this one. For
|
||||||
|
// example, when a user runs `zig fetch --save <url>`, this field is used
|
||||||
|
// as the key in the `dependencies` table. Although the user can choose a
|
||||||
|
// different name, most users will stick with this provided value.
|
||||||
|
//
|
||||||
|
// It is redundant to include "zig" in this name because it is already
|
||||||
|
// within the Zig package namespace.
|
||||||
|
.name = .zig_template,
|
||||||
|
// This is a [Semantic Version](https://semver.org/).
|
||||||
|
// In a future version of Zig it will be used for package deduplication.
|
||||||
|
.version = "0.0.1",
|
||||||
|
// Together with name, this represents a globally unique package
|
||||||
|
// identifier. This field is generated by the Zig toolchain when the
|
||||||
|
// package is first created, and then *never changes*. This allows
|
||||||
|
// unambiguous detection of one package being an updated version of
|
||||||
|
// another.
|
||||||
|
//
|
||||||
|
// When forking a Zig project, this id should be regenerated (delete the
|
||||||
|
// field and run `zig build`) if the upstream project is still maintained.
|
||||||
|
// Otherwise, the fork is *hostile*, attempting to take control over the
|
||||||
|
// original project's identity. Thus it is recommended to leave the comment
|
||||||
|
// on the following line intact, so that it shows up in code reviews that
|
||||||
|
// modify the field.
|
||||||
|
.fingerprint = 0xf2a35603e3f20fb6, // Changing this has security and trust implications.
|
||||||
|
// Tracks the earliest Zig version that the package considers to be a
|
||||||
|
// supported use case.
|
||||||
|
.minimum_zig_version = "0.15.2",
|
||||||
|
// This field is optional.
|
||||||
|
// Each dependency must either provide a `url` and `hash`, or a `path`.
|
||||||
|
// `zig build --fetch` can be used to fetch all dependencies of a package, recursively.
|
||||||
|
// Once all dependencies are fetched, `zig build` no longer requires
|
||||||
|
// internet connectivity.
|
||||||
|
.dependencies = .{
|
||||||
|
// See `zig fetch --save <url>` for a command-line interface for adding dependencies.
|
||||||
|
//.example = .{
|
||||||
|
// // When updating this field to a new URL, be sure to delete the corresponding
|
||||||
|
// // `hash`, otherwise you are communicating that you expect to find the old hash at
|
||||||
|
// // the new URL. If the contents of a URL change this will result in a hash mismatch
|
||||||
|
// // which will prevent zig from using it.
|
||||||
|
// .url = "https://example.com/foo.tar.gz",
|
||||||
|
//
|
||||||
|
// // This is computed from the file contents of the directory of files that is
|
||||||
|
// // obtained after fetching `url` and applying the inclusion rules given by
|
||||||
|
// // `paths`.
|
||||||
|
// //
|
||||||
|
// // This field is the source of truth; packages do not come from a `url`; they
|
||||||
|
// // come from a `hash`. `url` is just one of many possible mirrors for how to
|
||||||
|
// // obtain a package matching this `hash`.
|
||||||
|
// //
|
||||||
|
// // Uses the [multihash](https://multiformats.io/multihash/) format.
|
||||||
|
// .hash = "...",
|
||||||
|
//
|
||||||
|
// // When this is provided, the package is found in a directory relative to the
|
||||||
|
// // build root. In this case the package's hash is irrelevant and therefore not
|
||||||
|
// // computed. This field and `url` are mutually exclusive.
|
||||||
|
// .path = "foo",
|
||||||
|
//
|
||||||
|
// // When this is set to `true`, a package is declared to be lazily
|
||||||
|
// // fetched. This makes the dependency only get fetched if it is
|
||||||
|
// // actually used.
|
||||||
|
// .lazy = false,
|
||||||
|
//},
|
||||||
|
},
|
||||||
|
// Specifies the set of files and directories that are included in this package.
|
||||||
|
// Only files and directories listed here are included in the `hash` that
|
||||||
|
// is computed for this package. Only files listed here will remain on disk
|
||||||
|
// when using the zig package manager. As a rule of thumb, one should list
|
||||||
|
// files required for compilation plus any license(s).
|
||||||
|
// Paths are relative to the build root. Use the empty string (`""`) to refer to
|
||||||
|
// the build root itself.
|
||||||
|
// A directory listed here means that all files within, recursively, are included.
|
||||||
|
.paths = .{
|
||||||
|
"build.zig",
|
||||||
|
"build.zig.zon",
|
||||||
|
"src",
|
||||||
|
"LICENSE",
|
||||||
|
//"README.md",
|
||||||
|
},
|
||||||
|
}
|
||||||
67
flake.lock
generated
Normal file
67
flake.lock
generated
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1772736753,
|
||||||
|
"narHash": "sha256-au/m3+EuBLoSzWUCb64a/MZq6QUtOV8oC0D9tY2scPQ=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "917fec990948658ef1ccd07cef2a1ef060786846",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"systems": "systems",
|
||||||
|
"trev": "trev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"trev": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"systems": [
|
||||||
|
"systems"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1772876132,
|
||||||
|
"narHash": "sha256-yfHMAmihWLAXU9K3IZcY9u+x7e7/5IqVuZDgVT6UPl8=",
|
||||||
|
"owner": "spotdemo4",
|
||||||
|
"repo": "nur",
|
||||||
|
"rev": "832cb64ef80f65c9734d82feec1441f9d10e3b14",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "spotdemo4",
|
||||||
|
"repo": "nur",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
204
flake.nix
Normal file
204
flake.nix
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
{
|
||||||
|
description = "zig template";
|
||||||
|
|
||||||
|
nixConfig = {
|
||||||
|
extra-substituters = [
|
||||||
|
"https://nix.trev.zip"
|
||||||
|
];
|
||||||
|
extra-trusted-public-keys = [
|
||||||
|
"trev:I39N/EsnHkvfmsbx8RUW+ia5dOzojTQNCTzKYij1chU="
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
systems.url = "github:nix-systems/default";
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
||||||
|
trev = {
|
||||||
|
url = "github:spotdemo4/nur";
|
||||||
|
inputs.systems.follows = "systems";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs =
|
||||||
|
{
|
||||||
|
nixpkgs,
|
||||||
|
trev,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
trev.libs.mkFlake (
|
||||||
|
system:
|
||||||
|
let
|
||||||
|
pkgs = import nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
overlays = [
|
||||||
|
trev.overlays.packages
|
||||||
|
trev.overlays.libs
|
||||||
|
];
|
||||||
|
};
|
||||||
|
fs = pkgs.lib.fileset;
|
||||||
|
in
|
||||||
|
rec {
|
||||||
|
devShells = {
|
||||||
|
default = pkgs.mkShell {
|
||||||
|
shellHook = pkgs.shellhook.ref;
|
||||||
|
packages = with pkgs; [
|
||||||
|
zig
|
||||||
|
zls
|
||||||
|
lldb
|
||||||
|
|
||||||
|
# linters
|
||||||
|
octoscan
|
||||||
|
|
||||||
|
# formatters
|
||||||
|
nixfmt
|
||||||
|
prettier
|
||||||
|
|
||||||
|
# util
|
||||||
|
bumper
|
||||||
|
flake-release
|
||||||
|
renovate
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
bump = pkgs.mkShell {
|
||||||
|
packages = with pkgs; [
|
||||||
|
bumper
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
release = pkgs.mkShell {
|
||||||
|
packages = with pkgs; [
|
||||||
|
flake-release
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
update = pkgs.mkShell {
|
||||||
|
packages = with pkgs; [
|
||||||
|
renovate
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
vulnerable = pkgs.mkShell {
|
||||||
|
packages = with pkgs; [
|
||||||
|
# flake
|
||||||
|
flake-checker
|
||||||
|
|
||||||
|
# actions
|
||||||
|
octoscan
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
checks = pkgs.lib.mkChecks {
|
||||||
|
zig = {
|
||||||
|
src = packages.default;
|
||||||
|
script = ''
|
||||||
|
zig build test
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
actions = {
|
||||||
|
root = ./.;
|
||||||
|
fileset = ./.github/workflows;
|
||||||
|
deps = with pkgs; [
|
||||||
|
action-validator
|
||||||
|
octoscan
|
||||||
|
];
|
||||||
|
forEach = ''
|
||||||
|
action-validator $file
|
||||||
|
octoscan scan $file
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
renovate = {
|
||||||
|
root = ./.github;
|
||||||
|
fileset = ./.github/renovate.json;
|
||||||
|
deps = with pkgs; [
|
||||||
|
renovate
|
||||||
|
];
|
||||||
|
script = ''
|
||||||
|
renovate-config-validator renovate.json
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
nix = {
|
||||||
|
root = ./.;
|
||||||
|
filter = file: file.hasExt "nix";
|
||||||
|
deps = with pkgs; [
|
||||||
|
nixfmt
|
||||||
|
];
|
||||||
|
forEach = ''
|
||||||
|
nixfmt --check "$file"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
prettier = {
|
||||||
|
root = ./.;
|
||||||
|
filter = file: file.hasExt "yaml" || file.hasExt "json" || file.hasExt "md";
|
||||||
|
deps = with pkgs; [
|
||||||
|
prettier
|
||||||
|
];
|
||||||
|
forEach = ''
|
||||||
|
prettier --check "$file"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
packages = with pkgs.lib; rec {
|
||||||
|
default = pkgs.stdenv.mkDerivation (finalAttrs: {
|
||||||
|
pname = "zig-template";
|
||||||
|
version = "0.0.1";
|
||||||
|
|
||||||
|
src = fs.toSource {
|
||||||
|
root = ./.;
|
||||||
|
fileset = fs.unions [
|
||||||
|
./build.zig
|
||||||
|
./build.zig.zon
|
||||||
|
./src
|
||||||
|
./LICENSE
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
nativeBuildInputs = with pkgs; [
|
||||||
|
zig.hook
|
||||||
|
];
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
description = "zig template";
|
||||||
|
mainProgram = "zig_template";
|
||||||
|
homepage = "https://github.com/spotdemo4/zig-template";
|
||||||
|
changelog = "https://github.com/spotdemo4/zig-template/releases/tag/v${finalAttrs.version}";
|
||||||
|
license = licenses.mit;
|
||||||
|
platforms = platforms.all;
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
image = pkgs.dockerTools.buildLayeredImage {
|
||||||
|
name = default.pname;
|
||||||
|
tag = default.version;
|
||||||
|
|
||||||
|
contents = with pkgs; [
|
||||||
|
dockerTools.caCertificates
|
||||||
|
];
|
||||||
|
|
||||||
|
created = "now";
|
||||||
|
meta = default.meta;
|
||||||
|
|
||||||
|
config = {
|
||||||
|
Cmd = [ "${meta.getExe default}" ];
|
||||||
|
Labels = {
|
||||||
|
"org.opencontainers.image.title" = default.pname;
|
||||||
|
"org.opencontainers.image.description" = default.meta.description;
|
||||||
|
"org.opencontainers.image.version" = default.version;
|
||||||
|
"org.opencontainers.image.source" = default.meta.homepage;
|
||||||
|
"org.opencontainers.image.licenses" = default.meta.license.spdxId;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
formatter = pkgs.nixfmt-tree;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
27
src/main.zig
Normal file
27
src/main.zig
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
const std = @import("std");
|
||||||
|
const zig_template = @import("zig_template");
|
||||||
|
|
||||||
|
pub fn main() !void {
|
||||||
|
// Prints to stderr, ignoring potential errors.
|
||||||
|
std.debug.print("All your {s} are belong to us.\n", .{"codebase"});
|
||||||
|
try zig_template.bufferedPrint();
|
||||||
|
}
|
||||||
|
|
||||||
|
test "simple test" {
|
||||||
|
const gpa = std.testing.allocator;
|
||||||
|
var list: std.ArrayList(i32) = .empty;
|
||||||
|
defer list.deinit(gpa); // Try commenting this out and see if zig detects the memory leak!
|
||||||
|
try list.append(gpa, 42);
|
||||||
|
try std.testing.expectEqual(@as(i32, 42), list.pop());
|
||||||
|
}
|
||||||
|
|
||||||
|
test "fuzz example" {
|
||||||
|
const Context = struct {
|
||||||
|
fn testOne(context: @This(), input: []const u8) anyerror!void {
|
||||||
|
_ = context;
|
||||||
|
// Try passing `--fuzz` to `zig build test` and see if it manages to fail this test case!
|
||||||
|
try std.testing.expect(!std.mem.eql(u8, "canyoufindme", input));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
try std.testing.fuzz(Context{}, Context.testOne, .{});
|
||||||
|
}
|
||||||
23
src/root.zig
Normal file
23
src/root.zig
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
//! By convention, root.zig is the root source file when making a library.
|
||||||
|
const std = @import("std");
|
||||||
|
|
||||||
|
pub fn bufferedPrint() !void {
|
||||||
|
// Stdout is for the actual output of your application, for example if you
|
||||||
|
// are implementing gzip, then only the compressed bytes should be sent to
|
||||||
|
// stdout, not any debugging messages.
|
||||||
|
var stdout_buffer: [1024]u8 = undefined;
|
||||||
|
var stdout_writer = std.fs.File.stdout().writer(&stdout_buffer);
|
||||||
|
const stdout = &stdout_writer.interface;
|
||||||
|
|
||||||
|
try stdout.print("Run `zig build test` to run the tests.\n", .{});
|
||||||
|
|
||||||
|
try stdout.flush(); // Don't forget to flush!
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add(a: i32, b: i32) i32 {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
|
||||||
|
test "basic add functionality" {
|
||||||
|
try std.testing.expect(add(3, 7) == 10);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user