diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2009-06-26 13:53:31 +0000 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2009-06-26 13:53:31 +0000 |
commit | a440fba8e3cf552a2609be9da0202b355adebe2c (patch) | |
tree | da8de80dde393dd6e8943e44a130ce2c12640d72 /pkgs/lib/options.nix | |
parent | dd50af4923a71461262f3113022548edff545b79 (diff) | |
download | nixpkgs-a440fba8e3cf552a2609be9da0202b355adebe2c.tar nixpkgs-a440fba8e3cf552a2609be9da0202b355adebe2c.tar.gz nixpkgs-a440fba8e3cf552a2609be9da0202b355adebe2c.tar.bz2 nixpkgs-a440fba8e3cf552a2609be9da0202b355adebe2c.tar.lz nixpkgs-a440fba8e3cf552a2609be9da0202b355adebe2c.tar.xz nixpkgs-a440fba8e3cf552a2609be9da0202b355adebe2c.tar.zst nixpkgs-a440fba8e3cf552a2609be9da0202b355adebe2c.zip |
* Refactoring: move the types out of options.nix, which is much too
big. Also, they could be useful beyond option handling. svn path=/nixpkgs/trunk/; revision=16055
Diffstat (limited to 'pkgs/lib/options.nix')
-rw-r--r-- | pkgs/lib/options.nix | 112 |
1 files changed, 3 insertions, 109 deletions
diff --git a/pkgs/lib/options.nix b/pkgs/lib/options.nix index 6f408090738..6cf21ec6bcf 100644 --- a/pkgs/lib/options.nix +++ b/pkgs/lib/options.nix @@ -10,9 +10,8 @@ with import ./attrsets.nix; rec { - - hasType = x: isAttrs x && x ? _type; - typeOf = x: if hasType x then x._type else ""; + inherit (lib) typeOf; + isOption = attrs: (typeOf attrs) == "option"; mkOption = attrs: attrs // { @@ -131,112 +130,7 @@ rec { opt1 // opt2 )) {} opts; - - # name (name of the type) - # check (boolean function) - # merge (default merge function) - # iter (iterate on all elements contained in this type) - # fold (fold all elements contained in this type) - # hasOptions (boolean: whatever this option contains an option set) - # path (path contatenated to the option name contained contained in the option set) - isOptionType = attrs: (typeOf attrs) == "option-type"; - mkOptionType = attrs@{ - name - , check ? (x: true) - , merge ? mergeDefaultOption - # Handle complex structure types. - , iter ? (f: path: v: f path v) - , fold ? (op: nul: v: op v nul) - , docPath ? lib.id - # If the type can contains option sets. - , hasOptions ? false - }: { _type = "option-type"; - inherit name check merge iter fold docPath hasOptions; - }; - - - types = { - - inferred = mkOptionType { - name = "inferred type"; - }; - - bool = mkOptionType { - name = "boolean"; - check = lib.traceValIfNot builtins.isBool; - merge = fold lib.or false; - }; - - int = mkOptionType { - name = "integer"; - check = lib.traceValIfNot builtins.isInt; - }; - - string = mkOptionType { - name = "string"; - check = lib.traceValIfNot (x: builtins ? isString -> builtins.isString x); - merge = lib.concatStrings; - }; - - attrs = mkOptionType { - name = "attribute set"; - check = lib.traceValIfNot builtins.isAttrs; - merge = fold lib.mergeAttrs {}; - }; - - # derivation is a reserved keyword. - package = mkOptionType { - name = "derivation"; - check = lib.traceValIfNot isDerivation; - }; - - - list = elemType: mkOptionType { - name = "list of ${elemType.name}s"; - check = value: lib.traceValIfNot isList value && all elemType.check value; - merge = concatLists; - iter = f: path: list: map (elemType.iter f (path + ".*")) list; - fold = op: nul: list: lib.fold (e: l: elemType.fold op l e) nul list; - docPath = path: elemType.docPath (path + ".*"); - inherit (elemType) hasOptions; - }; - - attrsOf = elemType: mkOptionType { - name = "attribute set of ${elemType}s"; - check = x: lib.traceValIfNot builtins.isAttrs x - && fold (e: v: v && elemType.check e) true (lib.attrValues x); - merge = fold lib.mergeAttrs {}; - iter = f: path: set: lib.mapAttrs (name: elemType.iter f (path + "." + name)) set; - fold = op: nul: set: fold (e: l: elemType.fold op l e) nul (lib.attrValues set); - docPath = path: elemType.docPath (path + ".<name>"); - inherit (elemType) hasOptions; - }; - - uniq = elemType: mkOptionType { - inherit (elemType) name check iter fold docPath hasOptions; - merge = list: - if tail list == [] then - head list - else - throw "Multiple definitions. Only one is allowed for this option."; - }; - - nullOr = elemType: mkOptionType { - inherit (elemType) name merge docPath hasOptions; - check = x: builtins.isNull x || elemType.check x; - iter = f: path: v: if v == null then v else elemType.iter f path v; - fold = op: nul: v: if v == null then nul else elemType.fold op nul v; - }; - - optionSet = mkOptionType { - name = "option set"; - check = x: lib.traceValIfNot builtins.isAttrs x; - hasOptions = true; - }; - - }; - - + # !!! This function will be removed because this can be done with the # multiple option declarations. addDefaultOptionValues = defs: opts: opts // |