Compare commits
7 commits
2b84d5bbed
...
a8a685ccf3
Author | SHA1 | Date | |
---|---|---|---|
a8a685ccf3 | |||
599529fb03 | |||
32904e238f | |||
4caca606a3 | |||
6c134d9878 | |||
c9dd4abb28 | |||
16d97b8a29 |
2 changed files with 204 additions and 11 deletions
141
marker.nix
141
marker.nix
|
@ -1,27 +1,128 @@
|
|||
{ lib, config, ... }:
|
||||
let
|
||||
# Returns the uppercased first label or number of a string
|
||||
firstUpperAlnum =
|
||||
str:
|
||||
lib.mapNullable
|
||||
lib.head (builtins.match "[^A-Z0-9]*([A-Z0-9]).*" (lib.toUpper str));
|
||||
|
||||
userType = lib.types.submodule (
|
||||
{ name, ... }: {
|
||||
options = {
|
||||
departure = lib.mkOption {
|
||||
type = markerType;
|
||||
default = {};
|
||||
};
|
||||
|
||||
arrival = lib.mkOption {
|
||||
type = markerType;
|
||||
default = {};
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
departure.style.label = lib.mkDefault (firstUpperAlnum name);
|
||||
arrival.style.label = lib.mkDefault (firstUpperAlnum name);
|
||||
};
|
||||
});
|
||||
|
||||
markerType = lib.types.submodule {
|
||||
options = {
|
||||
location = lib.mkOption {
|
||||
type = lib.types.nullOr lib.types.str;
|
||||
default = null;
|
||||
};
|
||||
|
||||
style = {
|
||||
label = lib.mkOption {
|
||||
type = lib.types.nullOr
|
||||
(lib.types.strMatching "[0-9A-Z]");
|
||||
default = null;
|
||||
};
|
||||
|
||||
color = lib.mkOption {
|
||||
type = colorType;
|
||||
default = "red";
|
||||
};
|
||||
|
||||
size = lib.mkOption {
|
||||
type = lib.types.enum [
|
||||
"tiny"
|
||||
"small"
|
||||
"medium"
|
||||
"large"
|
||||
];
|
||||
|
||||
default = "medium";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
colorType = lib.types.either
|
||||
(lib.types.strMatching "0x[0-9A-F]{3}[0-9A-F]{3}?")
|
||||
(lib.types.enum [
|
||||
"black"
|
||||
"blue"
|
||||
"brown"
|
||||
"gray"
|
||||
"green"
|
||||
"orange"
|
||||
"purple"
|
||||
"red"
|
||||
"white"
|
||||
"yellow"
|
||||
]);
|
||||
in
|
||||
{
|
||||
imports = [
|
||||
./path.nix
|
||||
];
|
||||
|
||||
options = {
|
||||
users = lib.mkOption {
|
||||
type = lib.types.attrsOf userType;
|
||||
};
|
||||
|
||||
map.markers = lib.mkOption {
|
||||
type = lib.types.listOf markerType;
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
users = {
|
||||
manuel = {
|
||||
departure = {
|
||||
location = "Switzerland";
|
||||
style.size = "small";
|
||||
};
|
||||
|
||||
arrival = {
|
||||
location = "Prague";
|
||||
};
|
||||
|
||||
pathStyle = {
|
||||
weight = 10;
|
||||
};
|
||||
};
|
||||
|
||||
ganondorf.departure = {
|
||||
location = "Argentinia";
|
||||
|
||||
style = {
|
||||
color = "green";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
map = {
|
||||
markers = [
|
||||
{ location = "Switzerland"; }
|
||||
{ location = "New York"; }
|
||||
];
|
||||
markers = lib.filter
|
||||
(marker: marker.location != null)
|
||||
(
|
||||
lib.concatMap (user: [
|
||||
user.departure
|
||||
user.arrival
|
||||
]) (lib.attrValues config.users));
|
||||
|
||||
center = lib.mkIf
|
||||
(lib.length config.map.markers >= 1)
|
||||
|
@ -34,12 +135,30 @@ in
|
|||
|
||||
requestParams =
|
||||
let
|
||||
paramsForMarkers = builtins.map
|
||||
(marker: "$(${config.scripts.geocode}/bin/geocode ${
|
||||
lib.escapeShellArg marker.location})")
|
||||
config.map.markers;
|
||||
in [
|
||||
"markers=\"${lib.concatStringsSep "|" paramsForMarkers}\""
|
||||
];
|
||||
paramForMarker =
|
||||
marker:
|
||||
let
|
||||
size = {
|
||||
tiny = "tiny";
|
||||
small = "small";
|
||||
medium = "mid";
|
||||
large = null;
|
||||
}.${marker.style.size};
|
||||
attributes =
|
||||
lib.optional
|
||||
(marker.style.label != null)
|
||||
"label:${marker.style.label}"
|
||||
++ lib.optional
|
||||
(size != null)
|
||||
"size:${size}"
|
||||
++ [
|
||||
"color:${marker.style.color}"
|
||||
"$(${config.scripts.geocode}/bin/geocode ${
|
||||
lib.escapeShellArg marker.location
|
||||
})"
|
||||
];
|
||||
in
|
||||
"markers=\"${lib.concatStringsSep "|" attributes}\"";
|
||||
in builtins.map paramForMarker config.map.markers;
|
||||
};
|
||||
}
|
||||
|
|
74
path.nix
Normal file
74
path.nix
Normal file
|
@ -0,0 +1,74 @@
|
|||
{ lib, config, ... }:
|
||||
let
|
||||
pathType = lib.types.submodule {
|
||||
options = {
|
||||
locations = lib.mkOption {
|
||||
type = lib.types.listOf lib.types.str;
|
||||
};
|
||||
|
||||
style = lib.mkOption {
|
||||
type = pathStyleType;
|
||||
default = {};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
pathStyleType = lib.types.submodule {
|
||||
options = {
|
||||
weight = lib.mkOption {
|
||||
type = lib.types.ints.between 1 20;
|
||||
default = 5;
|
||||
};
|
||||
};
|
||||
};
|
||||
in
|
||||
{
|
||||
options = {
|
||||
users = lib.mkOption {
|
||||
type = lib.types.attrsOf (
|
||||
lib.types.submodule {
|
||||
options.pathStyle = lib.mkOption {
|
||||
type = pathStyleType;
|
||||
default = {};
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
map.paths = lib.mkOption {
|
||||
type = lib.types.listOf pathType;
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
map.paths = builtins.map (
|
||||
user: {
|
||||
locations = [
|
||||
user.departure.location
|
||||
user.arrival.location
|
||||
];
|
||||
|
||||
style = user.pathStyle;
|
||||
}) (lib.filter (
|
||||
user:
|
||||
user.departure.location != null
|
||||
&& user.arrival.location != null
|
||||
) (lib.attrValues config.users));
|
||||
|
||||
requestParams =
|
||||
let
|
||||
attrForLocation =
|
||||
loc: "$(${config.scripts.geocode}/bin/geocode ${lib.escapeShellArg loc})";
|
||||
paramForPath =
|
||||
path:
|
||||
let
|
||||
attributes =
|
||||
[
|
||||
"weight:${toString path.style.weight}"
|
||||
]
|
||||
++ builtins.map attrForLocation path.locations;
|
||||
in
|
||||
''path="${lib.concatStringsSep "|" attributes}"'';
|
||||
in
|
||||
builtins.map paramForPath config.map.paths;
|
||||
};
|
||||
}
|
Loading…
Reference in a new issue