Remix.run Logo
Show HN: Zig-DbC – A design by contract library for Zig
45 points by habedi0 6 days ago | 11 comments

Hi everyone,

I've made an open-source library for using design by contract (DbC) principles in the Zig programming language.

It's called Zig-DbC, and it currently provides the following features:

- A simple API to define preconditions, postconditions, and invariants.

- Contracts are active in `Debug`, `ReleaseSafe`, and `ReleaseSmall` modes to catch bugs early.

- All checks are removed at compile time in `ReleaseFast` mode for zero performance cost.

- An optional mode to handle partial state changes in functions that return errors.

- Transparent error handling that propagates errors from your code to the caller.

Project's GitHub repo: https://github.com/habedi/zig-dbc

metalliqaz 3 days ago | parent | next [-]

This is pretty cool, I like to see this kind of project coming to Zig. Zig's compile-time language features make DbC a natural fit.

I am not yet proficient enough in Zig to be able to evaluate how well the syntax fits into idiomatic Zig.

Good work.

habedi0 3 days ago | parent [-]

Thanks.

I'm new to Zig myself and created this library because I had trouble verifying the correctness of the code I wrote for a set of complex data structures in another larger Zig project (this one: https://github.com/habedi/ordered). I'm currently experimenting with how to use DbC in Zig, which led to the creation of this library.

skyzouwdev 3 days ago | parent | prev | next [-]

Nice! Always thought DbC was underused outside of languages like Eiffel. Cool to see it brought to Zig with zero-cost checks in ReleaseFast — that’s a solid balance between safety and performance.

skavi 3 days ago | parent | prev | next [-]

Why are the checks included in ReleaseSmall?

habedi0 3 days ago | parent [-]

I created this library to help me verify the correctness of my Zig code in another project. However, I wanted the option to strip the checks when the code becomes more mature, for efficiency. For efficiency, I mainly care about speed, which is why checks are only compiled out in `ReleaseFast`.

Defletter 3 days ago | parent | prev [-]

Another project burdened by Andrew Kelley's weird hate-boner for function literals.

    (struct { fn run }).run
How ridiculous that this is required to do something so simple.
ivanjermakov 2 days ago | parent [-]

Related RFC for context: https://github.com/ziglang/zig/issues/20242

habedi0 2 days ago | parent [-]

I think they want to add lambdas to Zig at some point. The number of changes is high between releases.

Defletter 2 days ago | parent [-]

Unless something has changed from this (https://github.com/ziglang/zig/issues/1717#issuecomment-1627...), that is unlikely. The irony is that Zig's new async/await strategy is to use event loops with passed-in functions (https://www.youtube.com/watch?v=x3hOiOcbgeA&t=3643s).

habedi0 2 days ago | parent [-]

That's kinda weird and sad. Lambdas are very useful TBH.

Defletter 2 days ago | parent [-]

Wouldn't surprise me whatsoever if someone creates zigplus, which is just some TypeScript-style superset that adds lambdas and interfaces to Zig as syntax sugar.