types: refactor source

This commit is contained in:
tv 2018-02-28 14:30:11 +01:00
parent 34e88f9cef
commit 3ac7941968
2 changed files with 47 additions and 59 deletions

View File

@ -18,10 +18,10 @@ let
type = types.attrsOf (types.submodule ({ config, ... }: { type = types.attrsOf (types.submodule ({ config, ... }: {
options = { options = {
origin = mkOption { origin = mkOption {
type = types.git-source; type = types.source-types.git;
}; };
mirror = mkOption { mirror = mkOption {
type = types.git-source; type = types.source-types.git;
}; };
}; };
config = { config = {
@ -31,7 +31,7 @@ let
})); }));
}; };
latest = mkOption { latest = mkOption {
type = types.nullOr types.git-source; type = types.nullOr types.source-types.git;
default = null; default = null;
}; };
timerConfig = mkOption { timerConfig = mkOption {

View File

@ -2,7 +2,7 @@
let let
inherit (lib) inherit (lib)
all any concatMapStringsSep concatStringsSep const filter flip all any attrNames concatMapStringsSep concatStringsSep const filter flip
genid hasSuffix head isInt isString length mergeOneOption mkOption genid hasSuffix head isInt isString length mergeOneOption mkOption
mkOptionType optional optionalAttrs optionals range splitString mkOptionType optional optionalAttrs optionals range splitString
stringLength substring test testString typeOf; stringLength substring test testString typeOf;
@ -231,90 +231,78 @@ rec {
source = submodule ({ config, ... }: { source = submodule ({ config, ... }: {
options = { options = {
type = let type = let
types = [ known-types = attrNames source-types;
"file" type-candidates = filter (k: config.${k} != null) known-types;
"git"
"pass"
"symlink"
];
in mkOption { in mkOption {
type = enum types; default = if length type-candidates == 1
default = let then head type-candidates
cands = filter (k: config.${k} != null) types; else throw "cannot determine type";
in type = enum known-types;
if length cands == 1
then head cands
else throw "cannot determine type";
}; };
file = let file = mkOption {
file-path = (file-source.getSubOptions "FIXME").path.type;
in mkOption {
type = nullOr (either file-source file-path);
default = null;
apply = x: apply = x:
if file-path.check x if absolute-pathname.check x
then { path = x; } then { path = x; }
else x; else x;
default = null;
type = nullOr (either absolute-pathname source-types.file);
}; };
git = mkOption { git = mkOption {
type = nullOr git-source;
default = null; default = null;
type = nullOr source-types.git;
}; };
pass = mkOption { pass = mkOption {
type = nullOr pass-source;
default = null; default = null;
type = nullOr source-types.pass;
}; };
symlink = let symlink = mkOption {
symlink-target = (symlink-source.getSubOptions "FIXME").target.type; type = nullOr (either pathname source-types.symlink);
in mkOption {
type = nullOr (either symlink-source symlink-target);
default = null; default = null;
apply = x: apply = x:
if symlink-target.check x if pathname.check x
then { target = x; } then { target = x; }
else x; else x;
}; };
}; };
}); });
file-source = submodule { source-types = {
options = { file = submodule {
path = mkOption { options = {
type = absolute-pathname; path = mkOption {
type = absolute-pathname;
};
}; };
}; };
}; git = submodule {
options = {
git-source = submodule { ref = mkOption {
options = { type = str; # TODO types.git.ref
ref = mkOption { };
type = str; # TODO types.git.ref url = mkOption {
}; type = str; # TODO types.git.url
url = mkOption { };
type = str; # TODO types.git.url
}; };
}; };
}; pass = submodule {
options = {
pass-source = submodule { dir = mkOption {
options = { type = absolute-pathname;
dir = mkOption { };
type = absolute-pathname; name = mkOption {
}; type = pathname; # TODO relative-pathname
name = mkOption { };
type = pathname; # TODO relative-pathname
}; };
}; };
}; symlink = submodule {
options = {
symlink-source = submodule { target = mkOption {
options = { type = pathname; # TODO relative-pathname
target = mkOption { };
type = pathname; # TODO relative-pathname
}; };
}; };
};
};
suffixed-str = suffs: suffixed-str = suffs:
mkOptionType { mkOptionType {