1{ config, lib, pkgs, ... }:
2with lib;
3let
4 concatAndSort = name: files: pkgs.runCommand name {} ''
5 awk 1 ${lib.escapeShellArgs files} | sed '{ /^\s*$/d; s/^\s\+//; s/\s\+$// }' | sort | uniq > $out
6 '';
7in
8{
9 options = {
10 environment.wordlist = {
11 enable = mkEnableOption "environment variables for lists of words";
12
13 lists = mkOption {
14 type = types.attrsOf (types.nonEmptyListOf types.path);
15
16 default = {
17 WORDLIST = [ "${pkgs.scowl}/share/dict/words.txt" ];
18 };
19
20 defaultText = literalExpression ''
21 {
22 WORDLIST = [ "''${pkgs.scowl}/share/dict/words.txt" ];
23 }
24 '';
25
26 description = ''
27 A set with the key names being the environment variable you'd like to
28 set and the values being a list of paths to text documents containing
29 lists of words. The various files will be merged, sorted, duplicates
30 removed, and extraneous spacing removed.
31
32 If you have a handful of words that you want to add to an already
33 existing wordlist, you may find `builtins.toFile` useful for this
34 task.
35 '';
36
37 example = literalExpression ''
38 {
39 WORDLIST = [ "''${pkgs.scowl}/share/dict/words.txt" ];
40 AUGMENTED_WORDLIST = [
41 "''${pkgs.scowl}/share/dict/words.txt"
42 "''${pkgs.scowl}/share/dict/words.variants.txt"
43 (builtins.toFile "extra-words" '''
44 desynchonization
45 oobleck''')
46 ];
47 }
48 '';
49 };
50 };
51 };
52
53 config = mkIf config.environment.wordlist.enable {
54 environment.variables =
55 lib.mapAttrs
56 (name: value: "${concatAndSort "wordlist-${name}" value}")
57 config.environment.wordlist.lists;
58 };
59}