forked from Fediversity/Fediversity
note that i worked around the question of how to delegate part of the options to the consumer by creating aliases for different parts of the function slot filling. i've been pretty arbitrary about this so far tho, and mostly to preserve existing interfaces, rather than out of conscious UX design per se. so the interface can def change still, but at least the _user_'s side is more DRY now!
58 lines
1.2 KiB
Nix
58 lines
1.2 KiB
Nix
/**
|
|
Modular function type
|
|
*/
|
|
{ config, lib, ... }:
|
|
let
|
|
inherit (lib) mkOption types;
|
|
inherit (types)
|
|
submodule
|
|
functionTo
|
|
optionType
|
|
;
|
|
in
|
|
{
|
|
options = {
|
|
input-type = mkOption {
|
|
type = optionType;
|
|
};
|
|
output-type = mkOption {
|
|
type = optionType;
|
|
};
|
|
function-type = mkOption {
|
|
type = optionType;
|
|
readOnly = true;
|
|
default = functionTo config.output-type;
|
|
};
|
|
wrapper-type = mkOption {
|
|
type = optionType;
|
|
readOnly = true;
|
|
default = functionTo (submodule {
|
|
options = {
|
|
input = mkOption {
|
|
type = config.input-type;
|
|
};
|
|
output = mkOption {
|
|
type = config.output-type;
|
|
};
|
|
};
|
|
});
|
|
};
|
|
implementation = mkOption {
|
|
type = config.function-type;
|
|
default = _: { };
|
|
};
|
|
wrapper = mkOption {
|
|
type = config.wrapper-type;
|
|
readOnly = true;
|
|
default = input: fn: {
|
|
inherit input;
|
|
output = config.implementation fn.config.input;
|
|
};
|
|
};
|
|
apply = mkOption {
|
|
type = config.function-type;
|
|
readOnly = true;
|
|
default = input: (config.wrapper input).output;
|
|
};
|
|
};
|
|
}
|