{
  liminix
, lib
, svc
}:
{ partlabel, mountpoint, options, fstype }:
let
  inherit (liminix.services) longrun oneshot;
  device = "/dev/disk/by-partlabel/${partlabel}";
  options_string =
    if options == [] then "" else "-o ${lib.concatStringsSep "," options}";
  mount_service = oneshot {
    name = "mount.${lib.escapeURL mountpoint}";
    timeout-up = 3600;
    up = "mount -t ${fstype} ${options_string} ${device} ${mountpoint}";
    down = "umount ${mountpoint}";
  };
in svc.uevent-rule.build {
  service = mount_service;
  symlink = device;
  terms = {
    partname = partlabel;
    devtype = "partition";
  };
}