Compare commits
No commits in common. "a8a685ccf3d84ed98d4eb9fc31827b88920becd6" and "2b84d5bbed16648cd616fe19cd8d6c06be000322" have entirely different histories.
a8a685ccf3
...
2b84d5bbed
2 changed files with 11 additions and 204 deletions
139
marker.nix
139
marker.nix
|
@ -1,128 +1,27 @@
|
||||||
{ lib, config, ... }:
|
{ lib, config, ... }:
|
||||||
let
|
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 {
|
markerType = lib.types.submodule {
|
||||||
options = {
|
options = {
|
||||||
location = lib.mkOption {
|
location = lib.mkOption {
|
||||||
type = lib.types.nullOr lib.types.str;
|
type = lib.types.nullOr lib.types.str;
|
||||||
default = null;
|
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
|
in
|
||||||
{
|
{
|
||||||
imports = [
|
|
||||||
./path.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
options = {
|
options = {
|
||||||
users = lib.mkOption {
|
|
||||||
type = lib.types.attrsOf userType;
|
|
||||||
};
|
|
||||||
|
|
||||||
map.markers = lib.mkOption {
|
map.markers = lib.mkOption {
|
||||||
type = lib.types.listOf markerType;
|
type = lib.types.listOf markerType;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
config = {
|
config = {
|
||||||
users = {
|
|
||||||
manuel = {
|
|
||||||
departure = {
|
|
||||||
location = "Switzerland";
|
|
||||||
style.size = "small";
|
|
||||||
};
|
|
||||||
|
|
||||||
arrival = {
|
|
||||||
location = "Prague";
|
|
||||||
};
|
|
||||||
|
|
||||||
pathStyle = {
|
|
||||||
weight = 10;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
ganondorf.departure = {
|
|
||||||
location = "Argentinia";
|
|
||||||
|
|
||||||
style = {
|
|
||||||
color = "green";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
map = {
|
map = {
|
||||||
markers = lib.filter
|
markers = [
|
||||||
(marker: marker.location != null)
|
{ location = "Switzerland"; }
|
||||||
(
|
{ location = "New York"; }
|
||||||
lib.concatMap (user: [
|
];
|
||||||
user.departure
|
|
||||||
user.arrival
|
|
||||||
]) (lib.attrValues config.users));
|
|
||||||
|
|
||||||
center = lib.mkIf
|
center = lib.mkIf
|
||||||
(lib.length config.map.markers >= 1)
|
(lib.length config.map.markers >= 1)
|
||||||
|
@ -135,30 +34,12 @@ in
|
||||||
|
|
||||||
requestParams =
|
requestParams =
|
||||||
let
|
let
|
||||||
paramForMarker =
|
paramsForMarkers = builtins.map
|
||||||
marker:
|
(marker: "$(${config.scripts.geocode}/bin/geocode ${
|
||||||
let
|
lib.escapeShellArg marker.location})")
|
||||||
size = {
|
config.map.markers;
|
||||||
tiny = "tiny";
|
in [
|
||||||
small = "small";
|
"markers=\"${lib.concatStringsSep "|" paramsForMarkers}\""
|
||||||
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
74
path.nix
|
@ -1,74 +0,0 @@
|
||||||
{ 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