blob: 6672843150ebb56a00cf0efcb8644913509fce93 [file] [log] [blame]
{
description = "Minion's NixOS configuration (since 2022-08-19)";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
nix-index-database.url = "github:Mic92/nix-index-database";
nix-index-database.inputs.nixpkgs.follows = "nixpkgs";
nixpkgs-unfree.url = "github:numtide/nixpkgs-unfree";
nixpkgs-unfree.inputs.nixpkgs.follows = "nixpkgs";
nixpkgs-minion.url = "github:Minion3665/nixpkgs";
flake-utils.url = "github:numtide/flake-utils";
flake-utils-plus.url = "github:gytis-ivaskevicius/flake-utils-plus";
crane.url = "github:ipetkov/crane";
vscode-extensions.url = "github:AmeerTaweel/nix-vscode-marketplace";
registry = {
url = "github:nixos/flake-registry";
flake = false;
};
home-manager.url = "github:nix-community/home-manager";
sops-nix.url = "github:Mic92/sops-nix";
impermanence.url = "github:nix-community/impermanence";
gtimelog = {
url = "git+https://gitlab.collabora.com/collabora/gtimelog.git";
flake = false;
};
fzf-tab = {
url = "github:Aloxaf/fzf-tab";
flake = false;
};
omnisharp-language-server = {
url = "github:coc-extensions/coc-omnisharp";
flake = false;
};
kmonad = {
url = "github:kmonad/kmonad?dir=nix";
inputs.nixpkgs.follows = "nixpkgs";
};
fenix.url = "github:nix-community/fenix";
nps.url = "github:OleMussmann/Nix-Package-Search";
lanzaboote.url = "github:nix-community/lanzaboote";
fenix.inputs.nixpkgs.follows = "nixpkgs";
flake-utils-plus.inputs.flake-utils.follows = "flake-utils";
home-manager.inputs.nixpkgs.follows = "nixpkgs";
sops-nix.inputs.nixpkgs.follows = "nixpkgs";
nps.inputs.nixpkgs.follows = "nixpkgs";
nps.inputs.flake-utils.follows = "flake-utils";
crane.inputs.nixpkgs.follows = "nixpkgs";
crane.inputs.flake-utils.follows = "flake-utils";
lanzaboote.inputs.nixpkgs.follows = "nixpkgs";
lanzaboote.inputs.flake-utils.follows = "flake-utils";
lanzaboote.inputs.crane.follows = "crane";
};
outputs = inputs:
let
inherit (inputs) self nixpkgs flake-utils;
in
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs {
inherit system;
overlays = import ./overlays nixpkgs.lib (inputs // {
inherit inputs
username;
});
};
utils = import ./utils pkgs;
username = "minion";
isAttrType = type:
if builtins.elem type.name [ "submodule" ]
then true
else if type ? nestedTypes.elemType
then isAttrType type.nestedTypes.elemType
else false;
normalizeOptions = options:
if
nixpkgs.lib.traceSeqN 2
{
inherit options;
type = builtins.typeOf options;
}
builtins.typeOf
options
== "set"
then
nixpkgs.lib.mapAttrs
(
name: value:
if
nixpkgs.lib.traceSeqN 3
{
inherit name value;
hasGetSubOpts = value ? getSubOptions;
hasType = value ? type;
isAttrType = value ? type && isAttrType value.type;
typeName = value.type.name or "unnamed";
type = builtins.typeOf value;
}
(builtins.typeOf value)
== "set"
then
nixpkgs.lib.traceVal
(normalizeOptions (
if value ? type && isAttrType value.type
then nixpkgs.lib.traceVal (value.type.getSubOptions [ ])
else nixpkgs.lib.traceVal value
))
else value
)
options
else options;
evalTrace = config: trace:
let
lib = nixpkgs.lib;
splitTrace = lib.splitString "." trace;
traceHead = builtins.head splitTrace;
traceTail = builtins.tail splitTrace;
resolvedTrace =
(
if traceHead == "home"
then [ "home-manager" "users" username ]
else lib.throwIfNot (traceHead == "config") ''You need to trace either home.** or config.** (found "${traceHead}" in "${trace}")'' [ ]
)
++ traceTail;
in
(
lib.pipe resolvedTrace [
(lib.foldl
({ value
, error
,
}: key:
if builtins.hasAttr key value
then {
value = value.${key};
inherit error;
}
else {
value = { };
error =
if error == false
then ''"${key}" does not exist in set "${builtins.toJSON value}"''
else error;
})
{
value = config;
error = false;
})
(data: lib.warnIf (data.error != false) ''trace/${trace} is invalid; the key ${data.error}'' data)
({ value
, error
,
}: {
value = builtins.toJSON value;
inherit error;
})
({ value
, error
,
}: {
value = "trace/${trace}: ${value}";
inherit error;
})
({ value
, error
,
}:
lib.warnIf (!error) value null)
]
);
in
{
packages = {
nixosConfigurations =
let
nixosSystem = (nixpkgs.lib.nixosSystem
{
inherit system;
modules = [
(nixpkgs.lib.pipe ./modules [
utils.nixFilesIn
(utils.interpretNonstandardModule (args:
args
// {
home = args.config.home-manager.users.${username};
home-options =
nixpkgs.lib.traceVal (normalizeOptions
(args.options.home-manager.users.type.getSubOptions [ ]));
inherit system utils;
}))
])
{
minion = import ./config.nix;
}
];
specialArgs = inputs // { inherit inputs username; };
});
in
{
default = builtins.deepSeq
(map (evalTrace nixosSystem.config) nixosSystem.config.internal.traces)
nixosSystem;
};
} // (import ./overlays/packages.nix
{ inherit (inputs) fenix crane; }
pkgs
pkgs);
devShell = pkgs.mkShell {
nativeBuildInputs = with pkgs; [ nodePackages.prettier nixpkgs-fmt ];
buildInputs = [ ];
};
formatter = pkgs.nixpkgs-fmt;
});
}