mirror of
				https://github.com/Jokiller230/puzzlevision.git
				synced 2025-10-31 13:50:04 +00:00 
			
		
		
		
	✨ (modules/flake) improve library loading and implement system class module mappings
This commit is contained in:
		
							parent
							
								
									7d16e19c8b
								
							
						
					
					
						commit
						f139b88c0b
					
				
					 9 changed files with 144 additions and 73 deletions
				
			
		|  | @ -1,50 +1,10 @@ | |||
| { | ||||
|   lib, | ||||
|   inputs, | ||||
|   config, | ||||
|   ... | ||||
| }: | ||||
| let | ||||
|   ## Recursive loading of libraries, similar to snowfall lib. | ||||
|   ## Logical flow: read files => merge all file outputs to single attr. set | ||||
|   ## The directory in question is flake-root => lib | ||||
|   ## The directory structure is: | ||||
|   ## lib/ | ||||
|   ##   => libname | ||||
|   ##     => default.nix | ||||
|   ##   => libname2 | ||||
|   ##     => default.nix | ||||
|   ## | ||||
|   ## The structure of multiple libs is simply for organization and the attrs. of all default.nix files should still be merged | ||||
|   ## into a single set. | ||||
|   loadLibs = directory: | ||||
|     builtins.foldl' (acc: name: | ||||
|       let | ||||
|         path = "${directory}/${name}"; | ||||
|         isDir = (builtins.getAttr name (builtins.readDir directory)) == "directory"; | ||||
|       in | ||||
|         if isDir then | ||||
|           lib.mergeAttrs acc (loadLibs path) | ||||
|         else if name == "default.nix" then | ||||
|           lib.mergeAttrs acc (import path { inherit lib; }) | ||||
|         else | ||||
|           acc | ||||
|     ) {} (builtins.attrNames (builtins.readDir directory)); | ||||
| in | ||||
| { | ||||
|   # Overwrite and add new arguments to all flake modules. | ||||
|   # Apply some useful module arguments. | ||||
|   _module.args = { | ||||
|     namespace = config.flake.namespace; | ||||
| 
 | ||||
|     puzzlelib = loadLibs ../../lib; | ||||
| 
 | ||||
|     # Initialize nixpkgs instance with custom overlays. | ||||
|     pkgs = import inputs.nixpkgs { | ||||
|       overlays = [ | ||||
|         (final: prev: { | ||||
|           # Todo: actually append overlays from "/overlays/overlay-name/default.nix" files. | ||||
|         }) | ||||
|       ]; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
|  |  | |||
|  | @ -1,9 +1,14 @@ | |||
| { | ||||
|   imports = [ | ||||
|     # Automagically imports overlays from "/overlays/overlay-name" and applies them to pkgs. | ||||
|     # Also applies some other useful arguments, like namespace, to all flake modules. | ||||
|     # Applies some useful arguments, like namespace, to all flake modules. | ||||
|     ./arguments.nix | ||||
| 
 | ||||
|     # Automagically imports libs from "/lib/lib-name" and applies them to the `lib.${namespace}` or `puzzlevision.lib` module argument. | ||||
|     ./lib.nix | ||||
| 
 | ||||
|     # Recursively imports overlays from "/overlays/overlay-name" and applies them to the `pkgs` or `puzzlevision.pkgs` module argument. | ||||
|     # ./overlays.nix | ||||
| 
 | ||||
|     # Automagically imports systems from "/systems/arch-classname/system-name". | ||||
|     ./systems.nix | ||||
|   ]; | ||||
|  |  | |||
							
								
								
									
										54
									
								
								modules/flake/lib.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								modules/flake/lib.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,54 @@ | |||
| { | ||||
|   lib, | ||||
|   puzzlelib, | ||||
|   ... | ||||
| }: | ||||
| let | ||||
|   # Utility function to read a directory and return its contents. | ||||
|   readDirectory = directory: builtins.readDir directory; | ||||
| 
 | ||||
|   # Utility function to handle each filesystem entity (file or directory). | ||||
|   filesystemEntityToAttrSet = directory: importArgs: name: type: | ||||
|     if type == "directory" then | ||||
|       dirToAttrSet "${directory}/${name}" importArgs | ||||
|     else if name == "default.nix" then | ||||
|       import "${directory}/${name}" importArgs | ||||
|     else | ||||
|       {}; | ||||
| 
 | ||||
|   filesystemEntityToList = directory: name: type: | ||||
|     if type == "directory" then | ||||
|       dirToModuleList "${directory}/${name}" | ||||
|     else if name == "default.nix" then | ||||
|       [ "${directory}/${name}" ] | ||||
|     else | ||||
|       []; | ||||
| 
 | ||||
|   dirToModuleList = directory: | ||||
|     let | ||||
|       readDir = readDirectory directory; | ||||
|     in | ||||
|       builtins.foldl' (acc: name: | ||||
|         acc ++ (filesystemEntityToList directory name (builtins.getAttr name readDir)) | ||||
|       ) [] (builtins.attrNames readDir); | ||||
| 
 | ||||
|   # Utility function to recursively load modules from a directory. | ||||
|   dirToAttrSet = directory: importArgs: | ||||
|     let | ||||
|       # Read provided directory only once at the very start and save the result. | ||||
|       readDir = readDirectory directory; | ||||
|     in | ||||
|       # Iterate over the attr names of a readDir operation. | ||||
|       builtins.foldl' (acc: name: | ||||
|         # Merge outputs of handling a filesystem entity (file or directory) into accumulator. | ||||
|         # Files return attribute sets with their resulting expressions, directories return the result of multiple file handling operations. | ||||
|         acc // (filesystemEntityToAttrSet directory importArgs name (builtins.getAttr name readDir)) | ||||
|       ) {} (builtins.attrNames readDir); | ||||
| in | ||||
| { | ||||
|   # Add lib.${namespace} attribute to module arguments, for easy access. | ||||
|   # Additionally, pass on dirToAttrSet method on lib.${namespace} for reusability in other modules. | ||||
|   _module.args = { | ||||
|     puzzlelib = dirToAttrSet ../../lib { inherit lib puzzlelib; } // { inherit dirToAttrSet dirToModuleList filesystemEntityToList filesystemEntityToAttrSet; }; | ||||
|   }; | ||||
| } | ||||
|  | @ -1,6 +1,8 @@ | |||
| { | ||||
|   lib, | ||||
|   inputs, | ||||
|   namespace, | ||||
|   puzzlelib, | ||||
|   ... | ||||
| }: | ||||
| { | ||||
|  | @ -12,19 +14,16 @@ | |||
| 
 | ||||
|     shared = { | ||||
|       specialArgs = { | ||||
|         inherit namespace; | ||||
|         inherit namespace puzzlelib; | ||||
|       }; | ||||
|     }; | ||||
| 
 | ||||
|     perClass = class: { | ||||
|       modules = [ | ||||
|         # Import modules based on current classname. | ||||
|         ../${class} | ||||
| 
 | ||||
|         (inputs.nixpkgs.lib.optionals (class == "nixos") [ | ||||
|         (lib.optionals (class == "nixos") [ | ||||
|           inputs.home-manager.nixosModules.default | ||||
|         ]) | ||||
|       ]; | ||||
|       ] ++ (puzzlelib.dirToModuleList ../${class}); # Import modules based on current classname. | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue