tvl-depot/nix/yants
sterni 58020730cd feat(nix/yants/tests): port to runTestsuite
Port existing tests to runTestsuite and add some obvious additional
tests that wouldn't be possible before (using assertThrows and
assertEq).

Change-Id: Ibe950a7a0cda3e23ebb226bdff35f52cdfec5ddf
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2479
Tested-by: BuildkiteCI
Reviewed-by: Profpatsch <mail@profpatsch.de>
Reviewed-by: tazjin <mail@tazj.in>
2021-02-09 21:57:56 +00:00
..
screenshots chore(yants): Prepare for depot-merge 2019-12-20 21:46:59 +00:00
tests feat(nix/yants/tests): port to runTestsuite 2021-02-09 21:57:56 +00:00
default.nix feat(nix/yants): add restrict 2021-01-03 15:53:18 +00:00
README.md docs(nix/yants): Mention Yants subtree split in README 2020-05-16 12:37:12 +01:00

yants

This is a tiny type-checker for data in Nix, written in Nix.

Features

  • Checking of primitive types (int, string etc.)
  • Checking polymorphic types (option, list, either)
  • Defining & checking struct/record types
  • Defining & matching enum types
  • Defining & matching sum types
  • Defining function signatures (including curried functions)
  • Types are composable! option string! list (either int (option float))!
  • Type errors also compose!

Currently lacking:

  • Any kind of inference
  • Convenient syntax for attribute-set function signatures

Primitives & simple polymorphism

simple

Structs

structs

Nested structs!

nested structs

Enums!

enums

Functions!

functions

Usage

Yants can be imported from its default.nix. A single attribute (lib) can be passed, which will otherwise be imported from <nixpkgs>.

TIP: You do not need to clone my whole repository to use Yants! It is split out into the nix/yants branch which you can clone with, for example, git clone -b nix/yants https://git.tazj.in yants.

Examples for the most common import methods would be:

  1. Import into scope with with:

    with (import ./default.nix {});
    # ... Nix code that uses yants ...
    
  2. Import as a named variable:

    let yants = import ./default.nix {};
    in yants.string "foo" # or other uses ...
    
  3. Overlay into pkgs.lib:

    # wherever you import your package set (e.g. from <nixpkgs>):
    import <nixpkgs> {
      overlays = [
        (self: super: {
          lib = super.lib // { yants = import ./default.nix { inherit (super) lib; }; };
        })
      ];
    }
    
    # yants now lives at lib.yants, besides the other library functions!
    

Please see my Nix one-pager for more generic information about the Nix language and what the above constructs mean.

Stability

The current API of Yants is not yet considered stable, but it works fine and should continue to do so even if used at an older version.

Yants' tests use Nix versions above 2.2 - compatibility with older versions is not guaranteed.