flakelight/default.nix

127 lines
3.7 KiB
Nix
Raw Normal View History

# flakelight -- Framework for simplifying flake setup
2023-04-09 02:56:06 +02:00
# Copyright (C) 2023 Archit Gupta <archit@accelbread.com>
# SPDX-License-Identifier: MIT
2024-01-10 08:23:13 +01:00
inputs:
2023-04-09 02:56:06 +02:00
let
2024-01-10 08:23:13 +01:00
inherit (inputs) nixpkgs;
inherit (builtins) isAttrs isPath readDir;
inherit (nixpkgs.lib) attrNames composeManyExtensions
filter findFirst fix genAttrs getValues hasSuffix isFunction isList
mapAttrsToList pathExists pipe removePrefix removeSuffix evalModules
mkDefault mkOptionType singleton;
inherit (nixpkgs.lib.types) coercedTo functionTo listOf;
inherit (nixpkgs.lib.options) mergeEqualOption mergeOneOption;
builtinModules = mapAttrsToList (k: _: ./builtinModules + ("/" + k))
(readDir ./builtinModules);
mkFlake = {
__functor = self: src: root: (evalModules {
specialArgs.modulesPath = ./builtinModules;
modules = builtinModules ++ self.extraModules ++ [
{ inputs.nixpkgs = mkDefault nixpkgs; }
2024-01-10 08:23:13 +01:00
{ inputs.flakelight = mkDefault inputs.self; }
{ _module.args = { inherit src flakelight; }; }
root
];
}).config.outputs;
# Attributes to allow module flakes to extend mkFlake
extraModules = [ ];
extend = (fix (extend': mkFlake': modules: fix (self: mkFlake' // {
extraModules = mkFlake'.extraModules ++ modules;
extend = extend' self;
}))) mkFlake;
};
flakelight = {
2023-08-27 09:01:48 +02:00
inherit mkFlake supportedSystem autoImport autoImportArgs;
types = {
overlay = mkOptionType {
name = "overlay";
description = "nixpkgs overlay";
descriptionClass = "noun";
check = isFunction;
merge = _: defs: composeManyExtensions (getValues defs);
};
2023-04-09 02:56:06 +02:00
packageDef = mkOptionType {
name = "packageDef";
description = "package definition";
descriptionClass = "noun";
check = isFunction;
merge = mergeOneOption;
};
path = mkOptionType {
name = "path";
description = "path";
descriptionClass = "noun";
check = isPath;
merge = mergeEqualOption;
};
function = mkOptionType {
name = "function";
description = "function";
descriptionClass = "noun";
check = isFunction;
merge = mergeOneOption;
};
module = mkOptionType {
name = "module";
description = "module";
descriptionClass = "noun";
check = x: isPath x || isFunction x || isAttrs x;
merge = _: defs: { imports = getValues defs; };
};
2023-12-07 07:46:11 +01:00
fileset = mkOptionType {
name = "fileset";
description = "fileset";
descriptionClass = "noun";
check = x: isPath x || x._type or null == "fileset";
};
optListOf = elemType: coercedTo elemType singleton (listOf elemType);
optFunctionTo = elemType: coercedTo elemType (x: _: x)
(functionTo elemType);
2023-04-09 02:56:06 +02:00
};
};
supportedSystem = { lib, stdenv, ... }:
lib.meta.availableOn stdenv.hostPlatform;
2023-04-15 22:42:53 +02:00
importDir = path: genAttrs
(pipe (readDir path) [
attrNames
(filter (s: s != "default.nix"))
(filter (hasSuffix ".nix"))
(map (removeSuffix ".nix"))
2023-04-15 20:02:06 +02:00
(map (removePrefix "_"))
])
(p: import (path + (if pathExists
2023-04-15 20:02:06 +02:00
(path + "/_${p}.nix") then "/_${p}.nix" else "/${p}.nix")));
autoImport = dir: name:
if isList name
then findFirst (x: x != null) null (map (autoImport dir) name)
else
if pathExists (dir + "/${name}.nix")
then import (dir + "/${name}.nix")
else if pathExists (dir + "/${name}/default.nix")
then import (dir + "/${name}")
else if pathExists (dir + "/${name}")
then importDir (dir + "/${name}")
else null;
2023-04-15 13:41:27 +02:00
2023-08-27 09:01:48 +02:00
autoImportArgs = dir: args: name:
let v = autoImport dir name; in
if isFunction v then v args else v;
2023-04-09 02:56:06 +02:00
in
flakelight