refactor: modified flake.nix to add treefmt and use flake-utils

This commit is contained in:
Ceferino Patino 2025-10-20 10:15:07 -05:00
commit 49a7d8d098
Signed by: c4patino
SSH key fingerprint: SHA256:9fQ9TsujGrdNNi76mnsu63v7dS5JOmHRZEqBOl49OR8
3 changed files with 289 additions and 62 deletions

119
flake.lock generated
View file

@ -1,24 +1,6 @@
{ {
"nodes": { "nodes": {
"flake-parts": { "flake-parts": {
"inputs": {
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
"lastModified": 1753121425,
"narHash": "sha256-TVcTNvOeWWk1DXljFxVRp+E0tzG1LhrVjOGGoMHuXio=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "644e0fc48951a860279da645ba77fe4a6e814c5e",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"flake-parts_2": {
"inputs": { "inputs": {
"nixpkgs-lib": [ "nixpkgs-lib": [
"nixvim", "nixvim",
@ -57,6 +39,24 @@
"type": "github" "type": "github"
} }
}, },
"flake-utils_2": {
"inputs": {
"systems": "systems_2"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"ixx": { "ixx": {
"inputs": { "inputs": {
"flake-utils": [ "flake-utils": [
@ -87,35 +87,20 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1753694789, "lastModified": 1760862643,
"narHash": "sha256-cKgvtz6fKuK1Xr5LQW/zOUiAC0oSQoA9nOISB0pJZqM=", "narHash": "sha256-PXwG0TM7Ek87DNx4LbGWuD93PbFeKAJs4FfALtp7Wo0=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "dc9637876d0dcc8c9e5e22986b857632effeb727", "rev": "33c6dca0c0cb31d6addcd34e90a63ad61826b28c",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nixos", "owner": "nixos",
"ref": "nixos-unstable", "ref": "nixos-25.05",
"repo": "nixpkgs", "repo": "nixpkgs",
"type": "github" "type": "github"
} }
}, },
"nixpkgs-lib": {
"locked": {
"lastModified": 1751159883,
"narHash": "sha256-urW/Ylk9FIfvXfliA1ywh75yszAbiTEVgpPeinFyVZo=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
"rev": "14a40a1d7fb9afa4739275ac642ed7301a9ba1ab",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nixpkgs.lib",
"type": "github"
}
},
"nixpkgs_2": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1753432016, "lastModified": 1753432016,
@ -132,12 +117,28 @@
"type": "github" "type": "github"
} }
}, },
"nixpkgs_3": {
"locked": {
"lastModified": 1760596604,
"narHash": "sha256-J/i5K6AAz/y5dBePHQOuzC7MbhyTOKsd/GLezSbEFiM=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "3cbe716e2346710d6e1f7c559363d14e11c32a43",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixvim": { "nixvim": {
"inputs": { "inputs": {
"flake-parts": "flake-parts_2", "flake-parts": "flake-parts",
"nixpkgs": "nixpkgs_2", "nixpkgs": "nixpkgs_2",
"nuschtosSearch": "nuschtosSearch", "nuschtosSearch": "nuschtosSearch",
"systems": "systems_2" "systems": "systems_3"
}, },
"locked": { "locked": {
"lastModified": 1753878247, "lastModified": 1753878247,
@ -155,7 +156,7 @@
}, },
"nuschtosSearch": { "nuschtosSearch": {
"inputs": { "inputs": {
"flake-utils": "flake-utils", "flake-utils": "flake-utils_2",
"ixx": "ixx", "ixx": "ixx",
"nixpkgs": [ "nixpkgs": [
"nixvim", "nixvim",
@ -178,9 +179,10 @@
}, },
"root": { "root": {
"inputs": { "inputs": {
"flake-parts": "flake-parts", "flake-utils": "flake-utils",
"nixpkgs": "nixpkgs", "nixpkgs": "nixpkgs",
"nixvim": "nixvim" "nixvim": "nixvim",
"treefmt-nix": "treefmt-nix"
} }
}, },
"systems": { "systems": {
@ -212,6 +214,39 @@
"repo": "default", "repo": "default",
"type": "github" "type": "github"
} }
},
"systems_3": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"treefmt-nix": {
"inputs": {
"nixpkgs": "nixpkgs_3"
},
"locked": {
"lastModified": 1760945191,
"narHash": "sha256-ZRVs8UqikBa4Ki3X4KCnMBtBW0ux1DaT35tgsnB1jM4=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "f56b1934f5f8fcab8deb5d38d42fd692632b47c2",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "treefmt-nix",
"type": "github"
}
} }
}, },
"root": "root", "root": "root",

View file

@ -1,47 +1,54 @@
{ {
description = "A nixvim configuration";
inputs = { inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-25.05";
nixvim.url = "github:nix-community/nixvim"; nixvim.url = "github:nix-community/nixvim";
flake-parts.url = "github:hercules-ci/flake-parts";
flake-utils.url = "github:numtide/flake-utils";
treefmt-nix.url = "github:numtide/treefmt-nix";
}; };
outputs = { outputs = {
self,
nixpkgs,
nixvim, nixvim,
flake-parts, flake-utils,
treefmt-nix,
... ...
} @ inputs: }:
flake-parts.lib.mkFlake {inherit inputs;} { flake-utils.lib.eachDefaultSystem (
systems = [ system: let
"x86_64-linux" namespace = "yumevim";
"aarch64-linux"
"x86_64-darwin" pkgs = import nixpkgs {inherit system;};
"aarch64-darwin" mergedLib = pkgs.lib.extend (final: prev: {${namespace} = import ./lib {lib = pkgs.lib;};});
];
perSystem = {
pkgs,
system,
...
}: let
nixvimLib = nixvim.lib.${system}; nixvimLib = nixvim.lib.${system};
nixvim' = nixvim.legacyPackages.${system}; nixvim' = nixvim.legacyPackages.${system};
nixvimModule = { nixvimModule = {
inherit pkgs; inherit pkgs;
module = import ./config; # import the module directly module = import ./config;
extraSpecialArgs = { extraSpecialArgs = {
lib = mergedLib.extend nixvim.lib.overlay;
namespace = namespace;
}; };
}; };
nvim = nixvim'.makeNixvimWithModule nixvimModule; nvim = nixvim'.makeNixvimWithModule nixvimModule;
treefmtConfig = {...}: {
projectRootFile = "flake.nix";
programs = {
alejandra.enable = true;
};
};
treefmtEval = treefmt-nix.lib.evalModule pkgs (treefmtConfig {inherit pkgs;});
in { in {
checks = { checks = {
default = nixvimLib.check.mkTestDerivationFromNixvimModule nixvimModule; default = nixvimLib.check.mkTestDerivationFromNixvimModule nixvimModule;
treefmt = treefmtEval.config.build.check self;
}; };
packages = { packages.default = nvim;
default = nvim; }
}; );
};
};
} }

185
lib/default.nix Normal file
View file

@ -0,0 +1,185 @@
{lib, ...}:
with lib; rec {
## Create a NixOS module option.
##
## ```nix
## lib.mkOpt nixpkgs.lib.types.str "My default" "Description of my option."
## ```
##
#@ Type -> Any -> String
mkOpt = type: default: description:
mkOption {inherit type default description;};
## Create a NixOS module option without a description.
##
## ```nix
## lib.mkOpt' nixpkgs.lib.types.str "My default"
## ```
##
#@ Type -> Any -> String
mkOpt' = type: default: mkOpt type default null;
## Create a boolean NixOS module option.
##
## ```nix
## lib.mkBoolOpt true "Description of my option."
## ```
##
#@ Type -> Any -> String
mkBoolOpt = mkOpt types.bool;
## Create a boolean NixOS module option without a description.
##
## ```nix
## lib.mkBoolOpt true
## ```
##
#@ Type -> Any -> String
mkBoolOpt' = mkOpt' types.bool;
## Quickly enable an option.
##
## ```nix
## services.nginx = enabled;
## ```
##
#@ true
enabled = {
enable = true;
};
## Quickly disable an option.
##
## ```nix
## services.nginx = enabled;
## ```
##
#@ false
disabled = {
enable = false;
};
## Recursively nest an attribute set under a list of keys.
##
## For example:
## ```nix
## mkNestedAttrs { enable = true; } [ "foo" "bar" ]
## ```
## returns:
## ```nix
## { foo = { bar = { enable = true; }; }; }
## ```
##
## @param attrs Attribute set to nest.
## @param keys List of keys (strings) to nest under.
## @return Nested attribute set.
mkNestedAttrs = attrs: keys:
if keys == []
then attrs
else {
"${lib.head keys}" = mkNestedAttrs attrs (lib.tail keys);
};
## Nest an attribute set under a dot-separated namespace string.
##
## For example:
## ```nix
## mkOptionsWithNamespace "foo.bar" { enable = true; }
## ```
## returns:
## ```nix
## { foo = { bar = { enable = true; }; }; }
## ```
##
## @param namespace A string like "foo.bar.baz".
## @param options An attribute set to nest under the namespace.
## @return A nested attribute set.
mkOptionsWithNamespace = namespace: options:
namespace
|> splitString "."
|> mkNestedAttrs options;
## Get a deeply nested attribute from a dot-separated path string.
##
## For example:
## ```nix
## getAttrByNamespace "foo.bar.baz" config
## ```
## is equivalent to:
## ```nix
## lib.getAttrFromPath [ "foo" "bar" "baz" ] config
## ```
##
## @param set The attribute set to query.
## @param namespace Dot-separated string path.
## @return The value at the nested path.
getAttrByNamespace = set: namespace:
namespace
|> splitString "."
|> (path: getAttrFromPath path set);
## Resolve the IP address of a given host from a devices attribute set.
##
## @param devices A set mapping hostnames to their configuration (must include `IP`).
## @param node The hostname to resolve.
## @return The IP address for the given node.
## @throws If the node is not defined in the devices set.
resolveHostIP = devices: node:
if builtins.hasAttr node devices
then devices.${node}.IP
else builtins.throw "Host '${node}' does not exist in the devices configuration.";
## Check for configuration conflicts between mount and share declarations.
##
## @param shares A list of folder names that are shared.
## @param hostName The name of the current host.
## @param folder The folder being mounted or shared.
## @param host The host the folder is being mounted from.
## @return Null if valid; throws an error if a conflict is detected.
## @throws If the host is self-mounting or if the folder appears in both shares and mounts.
checkHostMountConflict = {
shares,
hostName,
}: folder: host:
if host == hostName
then throw "Conflict: Mount host '${host}' cannot be the same as this host '${hostName}' for folder '${folder}'."
else if builtins.elem folder shares
then throw "Conflict: Folder '${folder}' is listed in both shares and mounts. Please resolve."
else null;
## Attempt to read a JSON file and return null of not valid JSON.
##
## @param path path to the json file to read
##
## @return JSON if valid; returns {} if invalid JSON.
readJsonOrEmpty = path: let
result =
path
|> builtins.readFile
|> builtins.fromJSON
|> builtins.tryEval;
in
if result.success
then result.value
else {};
## Safe get for deeply nested keys
##
## @param pathStr dot-separated list for the nested attribute to retrieve
## @param attrs attribute list for getting the keys
## @return attribute value if found; otherwise null
getIn = pathStr: attrs: let
path = splitString "." pathStr;
go = attrs: p:
if p == []
then attrs
else let
key = builtins.head p;
rest = builtins.tail p;
in
if builtins.hasAttr key attrs
then go (attrs.${key}) rest
else null;
in
go attrs path;
}