1
0
Fork 0
mirror of https://github.com/nix-community/home-manager.git synced 2025-11-08 11:36:05 +01:00
home-manager/modules/programs/khard.nix
Anton Mosich c3abf8ea1a
khard: support discover entries (#7785)
This adds support for discover type entries, which were introduced in
khard 0.20.0, which work very similar to the equally-named khal feature.
2025-09-13 19:31:16 -05:00

173 lines
4.9 KiB
Nix

{
config,
lib,
pkgs,
...
}:
let
inherit (lib) types;
cfg = config.programs.khard;
accounts = lib.filterAttrs (_: acc: acc.khard.enable) config.accounts.contact.accounts;
renderSettings =
with lib.generators;
toINI {
mkKeyValue = mkKeyValueDefault rec {
mkValueString =
v:
if lib.isList v then
lib.concatStringsSep ", " v
else if lib.isBool v then
if v then "yes" else "no"
else
v;
} "=";
};
in
{
meta.maintainers = [
lib.hm.maintainers.olmokramer
lib.maintainers.antonmosich
];
options = {
programs.khard = {
enable = lib.mkEnableOption "Khard: an address book for the Unix console";
package = lib.mkPackageOption pkgs "khard" { };
settings = lib.mkOption {
type =
with lib.types;
submodule {
freeformType =
let
primOrList = oneOf [
bool
str
(listOf str)
];
in
attrsOf (attrsOf primOrList);
options.general.default_action = lib.mkOption {
type = str;
default = "list";
description = "The default action to execute.";
};
};
default = { };
description = ''
Khard settings. See
<https://khard.readthedocs.io/en/latest/#configuration>
for more information.
'';
example = lib.literalExpression ''
{
general = {
default_action = "list";
editor = ["vim" "-i" "NONE"];
};
"contact table" = {
display = "formatted_name";
preferred_phone_number_type = ["pref" "cell" "home"];
preferred_email_address_type = ["pref" "work" "home"];
};
vcard = {
private_objects = ["Jabber" "Skype" "Twitter"];
};
}
'';
};
};
accounts.contact.accounts = lib.mkOption {
type = types.attrsOf (
types.submodule {
imports = [
(lib.mkRenamedOptionModule [ "khard" "defaultCollection" ] [ "khard" "addressbooks" ])
];
options.khard.enable = lib.mkEnableOption "khard access";
options.khard.addressbooks = lib.mkOption {
type = types.coercedTo types.str lib.toList (types.listOf types.str);
default = [ "" ];
description = ''
If provided, each item on this list will generate an
entry on khard configuration file as a separate addressbook
(vdir).
This is used for hardcoding sub-directories under the local
storage path
(accounts.contact.accounts.<name>.local.path) for khard. The
default value will set the aforementioned path as a single vdir.
'';
};
options.khard.type = lib.mkOption {
type = types.enum [
"vdir"
"discover"
];
default = "vdir";
description = ''
Either a single vdir located in [](#opt-accounts.contact.accounts._name_.local.path)
or multiple automatically discovered vdirs in
[](#opt-accounts.contact.accounts._name_.local.path)/[](#opt-accounts.contact.accounts._name_.khard.glob).
'';
};
options.khard.glob = lib.mkOption {
type = lib.types.str;
default = "*";
description = ''
The glob expansion to be searched for contacts when
type is set to discover.
'';
};
}
);
};
};
config = lib.mkIf cfg.enable {
home.packages = lib.mkIf (cfg.package != null) [ cfg.package ];
xdg.configFile."khard/khard.conf".text =
let
makePath =
baseDir: subDir:
builtins.toString (
/.
+ lib.concatStringsSep "/" [
baseDir
subDir
]
);
makeName = accName: abookName: accName + lib.optionalString (abookName != "") "-${abookName}";
makeEntry = anAccount: anAbook: ''
[[${makeName anAccount.name anAbook}]]
path = ${makePath anAccount.local.path anAbook}
'';
makeDiscoverEntry = anAccount: ''
[[${makeName anAccount.name ""}]]
path = ${anAccount.local.path}/${anAccount.khard.glob}
type = discover
'';
in
''
[addressbooks]
${lib.concatMapStringsSep "\n" (
acc:
if acc.khard.type == "discover" then
makeDiscoverEntry acc
else
lib.concatMapStringsSep "\n" (makeEntry acc) acc.khard.addressbooks
) (lib.attrValues accounts)}
${renderSettings cfg.settings}
'';
};
}