!wfudwzqQUiJYJnqfSY:nixos.org

NixOS Module System

155 Members
31 Servers

Load older messages


SenderMessageTime
19 Dec 2025
@zsuperx:matrix.orgzsuperi see, okay thanks02:59:57
@zsuperx:matrix.orgzsuperthen ill re-evaluate how i go about this. but thanks for the advice regardless!03:00:17
@bonjour:bonjour.zone班泽 💕 joined the room.08:08:40
@bonjour:bonjour.zone班泽 💕 left the room.08:25:17
@zsuperx:matrix.orgzsuper okay, i've been working on the PR for the nixos/bore module, but I'm at a bit of a roadblock when it comes to nixos tests. Since bore local requires a connection to a remote proxy server (i.e. "bore.pub"), should the nixos tests really be connecting to it to verify functionality? Rather, how does networking work with the test suite? Or should I only run tests for the server variant, which simply needs to check if it can listen on 0.0.0.0:<specified port>? 20:59:24
@zsuperx:matrix.orgzsuperactually i think i might be able to set up a server and a local proxy on the same machine that just interact with each other21:14:52
20 Dec 2025
@zsuperx:matrix.orgzsuperif anyone has free time, could you skim over this PR and see if things look fine? https://github.com/NixOS/nixpkgs/pull/472353 I'm hoping to ask some non-reviewers before I post in the Nixpkgs Review Requests, just so I can minimize the number of cycles I approach reviewers, who might be busy. Thanks in advance!02:39:01
@zsuperx:matrix.orgzsuper* if anyone has free time, could you skim over this PR and see if things look fine? https://github.com/NixOS/nixpkgs/pull/472353 I'm hoping to ask some non-reviewers before I post in the Nixpkgs Review Requests channel, just so I can minimize the number of cycles I approach reviewers, who might be busy. Thanks in advance!02:39:10
26 Dec 2025
@isabel:isabelroses.comisabel changed their profile picture.11:37:59
@jappie:jappie.devjappie changed their display name from jappie to jappie @ 39c3.15:49:41
27 Dec 2025
@jappie:jappie.devjappie changed their display name from jappie @ 39c3 to jasper @ 39c3 ☎️ 62749.13:30:50
30 Dec 2025
@jappie:jappie.devjappie changed their display name from jasper @ 39c3 ☎️ 62749 to jasper.23:38:40
@jappie:jappie.devjappie 23:40:10
4 Jan 2026
@sybearly:matrix.orgSyBearly joined the room.09:32:00
@jappie:jappie.devjappie changed their display name from jasper to jappie.10:59:43
5 Jan 2026
@user262728:synod.imuser262728 joined the room.03:21:02
11 Jan 2026
@ivank:matrix.orgivan joined the room.01:46:23
@sammy:cherrykitten.gaysammy (It/Its) left the room.14:37:00
12 Jan 2026
@arcterus:matrix.orgArcterus joined the room.09:25:24
@weriomat:matrix.orgweriomat joined the room.09:25:57
@bake.monorail:matrix.orgbake.monorail joined the room.09:59:43
@bake.monorail:matrix.orgbake.monorail

(continues from #nix-lang:nixos.org )
Matt Sturgeon:

you're asking a module system question, so NixOS Module System is more suitable 🙂

Ah! I didn't know about that channel. Thanks for pointing me here.

Either by shadowing check with submodule ... // { check = ...; } or extending it using lib.types.addCheck

Mh, I'd need to check how that works before I can fully understand that. Any reading material you suggest? Maybe there's a guide about internals of the modules type system.

Note that these may not work well with v2 check&merge (where checking is partly handled by the merge.v2 function).

No idea what v2 check&merge is, is that opt-in? Is something that's going in soon?

how should an empty module be handled?

None should match, type is a single-element enum with no default, so all of them should fail.

Right now I manually made a "union type" (where everything that a single type would allow, is allowed), and it has already bitten me.

10:04:52
@caiocdcs:tchncs.decaiocdcs joined the room.11:22:05
@isabel:isabelroses.comisabel changed their profile picture.18:59:29
13 Jan 2026
@jopejoe1:matrix.orgjopejoe1 changed their display name from jopejoe1 (4094@39c3) to jopejoe1 (4094@epvpn).08:26:49
14 Jan 2026
@hsjobeki:matrix.orghsjobeki

bake.monorail: Thanks for asking this here. I have some similar ideas. This is currently a limitation of the type system.

We don't have explicit union discriminators.

Because we currently use check as union discriminator.
The check of a submodule is isAttrs x || isFunction x || path.check x so the first submodule type gets picked always.

There are some action points that i'd like to accomplish and one needs to figure out the order of them:

  • Make oneOf the basetype of either. Currently inverted logic.
  • Allow user defined explicit discriminators. Currently: implicitly reusing check def where we should do discriminator merged.value
07:29:55
@hsjobeki:matrix.orghsjobekiIf you want to help out, doing some PRs i'm happy to answer questions07:30:58
@hsjobeki:matrix.orghsjobeki *

bake.monorail: Thanks for asking this here. I have some similar ideas. This is currently a limitation of the type system.

We don't have explicit union discriminators.

Because we currently use check as union discriminator.
The check of a submodule is isAttrs x || isFunction x || path.check x so the first submodule type gets picked always.

There are some action points that i'd like to accomplish and one needs to figure out the order of them:

  • Make oneOf the basetype of either. Currently inverted logic.
  • Allow user defined explicit discriminators. Currently: implicitly reusing check def where we should do something along !merged.headError && discriminator merged.value
07:36:00
@hsjobeki:matrix.orghsjobeki *

bake.monorail: Thanks for asking this here. I have some similar ideas. This is currently a limitation of the type system.

We don't have explicit union discriminators.

Because we currently use check as union discriminator.
The check of a submodule is isAttrs x || isFunction x || path.check x so the first submodule type gets picked always.

There are some action points that i'd like to accomplish and one needs to figure out the order of them:

  • Document the limitations of the current system
  • Make oneOf the basetype of either. Currently inverted logic.
  • Allow user defined explicit discriminators. Currently: implicitly reusing check def where we should do something along !merged.headError && discriminator merged.value
07:41:34
@bake.monorail:matrix.orgbake.monorail

I'd need to spend some time on the implementation of the modules system to be of some help.
I've no idea what the check function is, for instance.

I don't want to derail the discussion, but I'll just leave here my complaint that nix is lacking a type system and it's being reimplemented at run-time.
For instance, for "public API" functions I made up the following "type safe" function using the module system:

let
  typeSafeFunction =
    { options, implementation }:
    # Return a function that accepts some arguments
    arguments:
    # and invokes the implementation
    implementation
      # Passing as arguments the result of evaluating the module
      (pkgs.lib.evalModules {
        modules = [
          {
            inherit options;
            config = arguments;
          }
        ];
      }).config;
xxx = typeSafeFunction {
  options = { arg1 = mkOption { ...}; };
  implementation = { arg1 }: arg1 +1;
};
in
xxx { arg1 = 3; }

Which is a bit absurd.

It seems to me that the general feeling in the community is that nix won't get a type system any time soon. Maybe we need something like TypeScript, a TypeNix transpiler. I'm sure there already are some efforts like that.

09:17:51

Show newer messages


Back to Room ListRoom Version: 10