Apply nixfmt

This commit is contained in:
Robert Helgesson 2020-04-26 15:40:37 +02:00
parent b0df7d9919
commit a4a4774423
No known key found for this signature in database
GPG key ID: 36BDAA14C2797E89
7 changed files with 337 additions and 323 deletions

View file

@ -6,7 +6,8 @@ let
cfg = config.accounts.calendar;
localModule = name: types.submodule {
localModule = name:
types.submodule {
options = {
path = mkOption {
type = types.str;
@ -121,21 +122,15 @@ let
};
};
config = {
name = name;
};
config = { name = name; };
};
in
{
in {
options.accounts.calendar = {
basePath = mkOption {
type = types.str;
apply = p:
if hasPrefix "/" p
then p
else "${config.home.homeDirectory}/${p}";
if hasPrefix "/" p then p else "${config.home.homeDirectory}/${p}";
description = ''
The base directory in which to save calendars. May be a
relative path, in which case it is relative the home
@ -155,19 +150,13 @@ in
};
};
config = mkIf (cfg.accounts != { }) {
assertions =
let
assertions = let
primaries =
catAttrs "name"
(filter (a: a.primary)
(attrValues cfg.accounts));
in
[{
catAttrs "name" (filter (a: a.primary) (attrValues cfg.accounts));
in [{
assertion = length primaries <= 1;
message =
"Must have at most one primary calendar account but found "
+ toString (length primaries)
+ ", namely "
message = "Must have at most one primary calendar account but found "
+ toString (length primaries) + ", namely "
+ concatStringsSep ", " primaries;
}];
};

View file

@ -6,7 +6,8 @@ let
cfg = config.accounts.contact;
localModule = name: types.submodule {
localModule = name:
types.submodule {
options = {
path = mkOption {
type = types.str;
@ -104,21 +105,15 @@ let
};
};
config = {
name = name;
};
config = { name = name; };
};
in
{
in {
options.accounts.contact = {
basePath = mkOption {
type = types.str;
apply = p:
if hasPrefix "/" p
then p
else "${config.home.homeDirectory}/${p}";
if hasPrefix "/" p then p else "${config.home.homeDirectory}/${p}";
description = ''
The base directory in which to save contacts. May be a
relative path, in which case it is relative the home

View file

@ -23,9 +23,22 @@ with lib;
color = mkOption {
type = types.nullOr (types.enum [
"black" "white" "brown" "yellow" "dark gray" "dark green" "dark blue"
"light gray" "light green" "light blue" "dark magenta" "dark cyan"
"dark red" "light magenta" "light cyan" "light red"
"black"
"white"
"brown"
"yellow"
"dark gray"
"dark green"
"dark blue"
"light gray"
"light green"
"light blue"
"dark magenta"
"dark cyan"
"dark red"
"light magenta"
"light cyan"
"light red"
]);
default = null;
description = ''

View file

@ -10,33 +10,32 @@ let
khalCalendarAccounts =
filterAttrs (_: a: a.khal.enable) config.accounts.calendar.accounts;
khalContactAccounts =
mapAttrs (_: v: v // { type = "birthdays"; })
khalContactAccounts = mapAttrs (_: v: v // { type = "birthdays"; })
(filterAttrs (_: a: a.khal.enable) config.accounts.contact.accounts);
khalAccounts = khalCalendarAccounts // khalContactAccounts;
primaryAccount =
findSingle (a: a.primary) null null
primaryAccount = findSingle (a: a.primary) null null
(mapAttrsToList (n: v: v // { name = n; }) khalAccounts);
definedAttrs = filterAttrs (_: v: !isNull v);
toKeyValueIfDefined = attrs:
generators.toKeyValue {} (definedAttrs attrs);
toKeyValueIfDefined = attrs: generators.toKeyValue { } (definedAttrs attrs);
genCalendarStr = name: value:
concatStringsSep "\n" (
[
concatStringsSep "\n" ([
"[[${name}]]"
"path = ${value.local.path + "/" + (optionalString (value.khal.type == "discover") value.khal.glob)}"
]
++ optional (value.khal.readOnly) "readonly = True"
++ [ (toKeyValueIfDefined (getAttrs [ "type" "color" "priority" ] value.khal)) ]
++ ["\n"]
);
"path = ${
value.local.path + "/"
+ (optionalString (value.khal.type == "discover") value.khal.glob)
}"
] ++ optional (value.khal.readOnly) "readonly = True" ++ [
(toKeyValueIfDefined (getAttrs [ "type" "color" "priority" ] value.khal))
] ++ [ "\n" ]);
localeFormatOptions = let T = lib.types; in mapAttrs (n: v: v // {
localeFormatOptions = let T = lib.types;
in mapAttrs (n: v:
v // {
description = v.description + ''
Format strings are for python 'strftime', similarly to man 3 strftime.
@ -85,8 +84,8 @@ let
};
};
localeOptions = let T = lib.types; in localeFormatOptions // {
localeOptions = let T = lib.types;
in localeFormatOptions // {
unicode_symbols = {
type = T.bool;
default = true;
@ -136,9 +135,7 @@ let
};
};
in
{
in {
options.programs.khal = {
enable = mkEnableOption "khal, a CLI calendar application";
locale = mkOption {
@ -154,21 +151,18 @@ in
config = mkIf cfg.enable {
home.packages = [ pkgs.khal ];
xdg.configFile."khal/config".text = concatStringsSep "\n" (
[
"[calendars]"
]
++ mapAttrsToList genCalendarStr khalAccounts
++
[
xdg.configFile."khal/config".text = concatStringsSep "\n" ([ "[calendars]" ]
++ mapAttrsToList genCalendarStr khalAccounts ++ [
(generators.toINI { } {
locale = definedAttrs (cfg.locale // { _module = null; });
default = optionalAttrs (!isNull primaryAccount) {
default_calendar = if isNull primaryAccount.primaryCollection then primaryAccount.name else primaryAccount.primaryCollection;
default_calendar = if isNull primaryAccount.primaryCollection then
primaryAccount.name
else
primaryAccount.primaryCollection;
};
})
]
);
]);
};
}

View file

@ -6,9 +6,7 @@ let
collection = types.either types.str (types.listOf types.str);
in
{
in {
options.vdirsyncer = {
enable = mkEnableOption "synchronization using vdirsyncer";
@ -21,10 +19,8 @@ in
};
conflictResolution = mkOption {
type =
types.nullOr
(types.either
(types.enum ["remote wins" "local wins"])
type = types.nullOr
(types.either (types.enum [ "remote wins" "local wins" ])
(types.listOf types.str));
default = null;
description = ''

View file

@ -6,19 +6,19 @@ let
cfg = config.programs.vdirsyncer;
vdirsyncerCalendarAccounts =
filterAttrs (_: v: v.vdirsyncer.enable)
(mapAttrs' (n: v: nameValuePair ("calendar_" + n) v) config.accounts.calendar.accounts);
vdirsyncerCalendarAccounts = filterAttrs (_: v: v.vdirsyncer.enable)
(mapAttrs' (n: v: nameValuePair ("calendar_" + n) v)
config.accounts.calendar.accounts);
vdirsyncerContactAccounts =
filterAttrs (_: v: v.vdirsyncer.enable)
(mapAttrs' (n: v: nameValuePair ("contacts_" + n) v) config.accounts.contact.accounts);
vdirsyncerContactAccounts = filterAttrs (_: v: v.vdirsyncer.enable)
(mapAttrs' (n: v: nameValuePair ("contacts_" + n) v)
config.accounts.contact.accounts);
vdirsyncerAccounts = vdirsyncerCalendarAccounts // vdirsyncerContactAccounts;
wrap = s: ''"${s}"'';
listString = l: ''[${concatStringsSep ", " l}]'';
listString = l: "[${concatStringsSep ", " l}]";
boolString = b: if b then "true" else "false";
@ -26,23 +26,21 @@ let
filterAttrs (_: v: v != null)
((getAttrs [ "type" "fileExt" "encoding" ] a.local) // {
path = a.local.path;
postHook =
pkgs.writeShellScriptBin "post-hook" a.vdirsyncer.postHook
postHook = pkgs.writeShellScriptBin "post-hook" a.vdirsyncer.postHook
+ "/bin/post-hook";
});
remoteStorage = a:
filterAttrs (_: v: v != null)
((getAttrs [
filterAttrs (_: v: v != null) ((getAttrs [
"type"
"url"
"userName"
#"userNameCommand"
"passwordCommand"
] a.remote) //
(if a.vdirsyncer == null
then {}
else getAttrs [
] a.remote) // (if a.vdirsyncer == null then
{ }
else
getAttrs [
"itemTypes"
"verify"
"verifyFingerprint"
@ -58,64 +56,83 @@ let
pair = a:
with a.vdirsyncer;
filterAttrs (k: v: k == "collections" || (v != null && v != [ ]))
(getAttrs [ "collections" "conflictResolution" "metadata" "partialSync" ] a.vdirsyncer);
(getAttrs [ "collections" "conflictResolution" "metadata" "partialSync" ]
a.vdirsyncer);
pairs = mapAttrs (_: v: pair v) vdirsyncerAccounts;
localStorages = mapAttrs (_: v: localStorage v) vdirsyncerAccounts;
remoteStorages = mapAttrs (_: v: remoteStorage v) vdirsyncerAccounts;
optionString = n: v:
if (n == "type") then ''type = "${v}"''
else if (n == "path") then ''path = "${v}"''
else if (n == "fileExt") then ''fileext = "${v}"''
else if (n == "encoding") then ''encoding = "${v}"''
else if (n == "postHook") then ''post_hook = "${v}"''
else if (n == "url") then ''url = "${v}"''
if (n == "type") then
''type = "${v}"''
else if (n == "path") then
''path = "${v}"''
else if (n == "fileExt") then
''fileext = "${v}"''
else if (n == "encoding") then
''encoding = "${v}"''
else if (n == "postHook") then
''post_hook = "${v}"''
else if (n == "url") then
''url = "${v}"''
else if (n == "timeRange") then ''
start_date = "${v.start}"
end_date = "${v.end}"''
else if (n == "itemTypes") then ''
item_types = ${listString (map wrap v)}''
else if (n == "userName") then ''username = "${v}"''
else if (n == "userNameCommand") then ''
username.fetch = ${listString (map wrap (["command"] ++ v))}''
else if (n == "password") then ''password = "${v}"''
else if (n == "passwordCommand") then ''
password.fetch = ${listString (map wrap (["command"] ++ v))}''
else if (n == "passwordPrompt") then ''
password.fetch = ["prompt", "${v}"]''
else if (n == "verify") then ''
verify = ${if v then "true" else "false"}''
else if (n == "verifyFingerprint") then ''
verify_fingerprint = "${v}"''
else if (n == "auth") then ''auth = "${v}"''
else if (n == "authCert" && isString(v)) then ''
auth_cert = "${v}"''
else if (n == "authCert") then ''
auth_cert = ${listString (map wrap v)}''
else if (n == "userAgent") then ''useragent = "${v}"''
else if (n == "tokenFile") then ''token_file = "${v}"''
else if (n == "clientId") then ''client_id = "${v}"''
else if (n == "clientIdCommand") then ''
client_id.fetch = ${listString (map wrap (["command"] ++ v))}''
else if (n == "clientSecret") then ''client_secret = "${v}"''
else if (n == "clientSecretCommand") then ''
client_secret.fetch = ${listString (map wrap (["command"] ++ v))}''
else if (n == "metadata") then ''metadata = ${listString (map wrap v)}''
else if (n == "partialSync") then ''partial_sync = "${v}"''
end_date = "${v.end}"'' else if (n == "itemTypes") then
"item_types = ${listString (map wrap v)}"
else if (n == "userName") then
''username = "${v}"''
else if (n == "userNameCommand") then
"username.fetch = ${listString (map wrap ([ "command" ] ++ v))}"
else if (n == "password") then
''password = "${v}"''
else if (n == "passwordCommand") then
"password.fetch = ${listString (map wrap ([ "command" ] ++ v))}"
else if (n == "passwordPrompt") then
''password.fetch = ["prompt", "${v}"]''
else if (n == "verify") then
"verify = ${if v then "true" else "false"}"
else if (n == "verifyFingerprint") then
''verify_fingerprint = "${v}"''
else if (n == "auth") then
''auth = "${v}"''
else if (n == "authCert" && isString (v)) then
''auth_cert = "${v}"''
else if (n == "authCert") then
"auth_cert = ${listString (map wrap v)}"
else if (n == "userAgent") then
''useragent = "${v}"''
else if (n == "tokenFile") then
''token_file = "${v}"''
else if (n == "clientId") then
''client_id = "${v}"''
else if (n == "clientIdCommand") then
"client_id.fetch = ${listString (map wrap ([ "command" ] ++ v))}"
else if (n == "clientSecret") then
''client_secret = "${v}"''
else if (n == "clientSecretCommand") then
"client_secret.fetch = ${listString (map wrap ([ "command" ] ++ v))}"
else if (n == "metadata") then
"metadata = ${listString (map wrap v)}"
else if (n == "partialSync") then
''partial_sync = "${v}"''
else if (n == "collections") then
let
contents = map (c: if (isString c)
then ''"${c}"''
else listString (map wrap c)) v;
in ''collections = ${if ((isNull v) || v == []) then "null" else listString contents}''
contents =
map (c: if (isString c) then ''"${c}"'' else listString (map wrap c))
v;
in "collections = ${
if ((isNull v) || v == [ ]) then "null" else listString contents
}"
else if (n == "conflictResolution") then
if v == "remote wins"
then ''conflict_resolution = "a wins"''
else if v == "local wins"
then ''conflict_resolution = "b wins"''
else ''conflict_resolution = ${listString (map wrap (["command"] ++ v))}''
else throw "Unrecognized option: ${n}";
if v == "remote wins" then
''conflict_resolution = "a wins"''
else if v == "local wins" then
''conflict_resolution = "b wins"''
else
"conflict_resolution = ${listString (map wrap ([ "command" ] ++ v))}"
else
throw "Unrecognized option: ${n}";
attrsString = a: concatStringsSep "\n" (mapAttrsToList optionString a);
@ -136,15 +153,18 @@ let
### Local storages
${concatStringsSep "\n\n" (mapAttrsToList (n: v: "[storage ${n}_local]" + "\n" + attrsString v) localStorages)}
${concatStringsSep "\n\n"
(mapAttrsToList (n: v: "[storage ${n}_local]" + "\n" + attrsString v)
localStorages)}
### Remote storages
${concatStringsSep "\n\n" (mapAttrsToList (n: v: "[storage ${n}_remote]" + "\n" + attrsString v) remoteStorages)}
${concatStringsSep "\n\n"
(mapAttrsToList (n: v: "[storage ${n}_remote]" + "\n" + attrsString v)
remoteStorages)}
'';
in
{
in {
options = {
programs.vdirsyncer = {
enable = mkEnableOption "vdirsyncer";
@ -177,12 +197,19 @@ in
assertions = let
requiredOptions = t:
if (t == "caldav" || t == "carddav" || t == "http") then [ "url" ]
else if (t == "filesystem") then [ "path" "fileExt" ]
else if (t == "singlefile") then [ "path" ]
else if (t == "google_calendar" || t == "google_contacts") then
[ "tokenFile" "clientId" "clientSecret"]
else throw "Unrecognized storage type: ${t}";
if (t == "caldav" || t == "carddav" || t == "http") then
[ "url" ]
else if (t == "filesystem") then [
"path"
"fileExt"
] else if (t == "singlefile") then
[ "path" ]
else if (t == "google_calendar" || t == "google_contacts") then [
"tokenFile"
"clientId"
"clientSecret"
] else
throw "Unrecognized storage type: ${t}";
allowedOptions = let
remoteOptions = [
@ -198,47 +225,50 @@ in
"userAgent"
];
in t:
if (t == "caldav")
then [ "timeRange" "itemTypes" ] ++ remoteOptions
else if (t == "carddav" || t == "http")
then remoteOptions
else if (t == "filesystem")
then [ "fileExt" "encoding" "postHook" ]
else if (t == "singlefile")
then [ "encoding" ]
else if (t == "google_calendar") then
[ "timeRange" "itemTypes" "clientIdCommand" "clientSecretCommand" ]
else if (t == "google_contacts") then [ "clientIdCommand" "clientSecretCommand" ]
else throw "Unrecognized storage type: ${t}";
if (t == "caldav") then
[ "timeRange" "itemTypes" ] ++ remoteOptions
else if (t == "carddav" || t == "http") then
remoteOptions
else if (t == "filesystem") then [
"fileExt"
"encoding"
"postHook"
] else if (t == "singlefile") then
[ "encoding" ]
else if (t == "google_calendar") then [
"timeRange"
"itemTypes"
"clientIdCommand"
"clientSecretCommand"
] else if (t == "google_contacts") then [
"clientIdCommand"
"clientSecretCommand"
] else
throw "Unrecognized storage type: ${t}";
assertStorage = n: v:
let
allowed = allowedOptions v.type ++ (requiredOptions v.type);
in
mapAttrsToList (
a: v': [
{
let allowed = allowedOptions v.type ++ (requiredOptions v.type);
in mapAttrsToList (a: v':
[{
assertion = (elem a allowed);
message = ''
Storage ${n} is of type ${v.type}. Option
${a} is not allowed for this type.
'';
}
] ++
(let required = filter (a: !hasAttr "${a}Command" v) (requiredOptions v.type);
}] ++ (let
required =
filter (a: !hasAttr "${a}Command" v) (requiredOptions v.type);
in map (a: [{
assertion = hasAttr a v;
message = ''
Storage ${n} is of type ${v.type}, but required
option ${a} is not set.
'';
}]) required)
) (removeAttrs v ["type" "_module"]);
}]) required)) (removeAttrs v [ "type" "_module" ]);
storageAssertions = flatten (mapAttrsToList assertStorage localStorages)
++ flatten (mapAttrsToList assertStorage remoteStorages);
in storageAssertions;
home.packages = [ cfg.package ];
xdg.configFile."vdirsyncer/config".source = configFile;

View file

@ -6,13 +6,11 @@ let
cfg = config.services.vdirsyncer;
vdirsyncerOptions =
[ ] ++ optional (cfg.verbosity != null) "--verbosity ${cfg.verbosity}"
vdirsyncerOptions = [ ]
++ optional (cfg.verbosity != null) "--verbosity ${cfg.verbosity}"
++ optional (cfg.configFile != null) "--config ${cfg.configFile}";
in
{
in {
meta.maintainers = [ maintainers.pjones ];
options.services.vdirsyncer = {
@ -41,7 +39,8 @@ in
};
verbosity = mkOption {
type = types.nullOr (types.enum [ "CRITICAL" "ERROR" "WARNING" "INFO" "DEBUG"]);
type = types.nullOr
(types.enum [ "CRITICAL" "ERROR" "WARNING" "INFO" "DEBUG" ]);
default = null;
description = ''
Whether vdirsyncer should produce verbose output.
@ -68,23 +67,21 @@ in
Service = {
Type = "oneshot";
# TODO `vdirsyncer discover`
ExecStart = "${cfg.package}/bin/vdirsyncer sync ${concatStringsSep " " vdirsyncerOptions}";
ExecStart = "${cfg.package}/bin/vdirsyncer sync ${
concatStringsSep " " vdirsyncerOptions
}";
};
};
systemd.user.timers.vdirsyncer = {
Unit = {
Description = "vdirsyncer calendar&contacts synchronization";
};
Unit = { Description = "vdirsyncer calendar&contacts synchronization"; };
Timer = {
OnCalendar = cfg.frequency;
Unit = "vdirsyncer.service";
};
Install = {
WantedBy = [ "timers.target" ];
};
Install = { WantedBy = [ "timers.target" ]; };
};
};
}