Compare commits
No commits in common. "2b84d5bbed16648cd616fe19cd8d6c06be000322" and "2707d84a50f2d734cccca18afeee80d36de8881d" have entirely different histories.
2b84d5bbed
...
2707d84a50
3 changed files with 11 additions and 151 deletions
64
default.nix
64
default.nix
|
@ -1,30 +1,8 @@
|
||||||
{ pkgs, lib, config, ... }:
|
{ pkgs, lib, config, ... }:
|
||||||
{
|
{
|
||||||
imports = [
|
|
||||||
./marker.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
options = {
|
options = {
|
||||||
scripts = {
|
scripts.output = lib.mkOption {
|
||||||
output = lib.mkOption {
|
type = lib.types.package;
|
||||||
type = lib.types.package;
|
|
||||||
};
|
|
||||||
|
|
||||||
geocode = lib.mkOption {
|
|
||||||
type = lib.types.package;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
map = {
|
|
||||||
zoom = lib.mkOption {
|
|
||||||
type = lib.types.nullOr lib.types.int;
|
|
||||||
default = 2;
|
|
||||||
};
|
|
||||||
|
|
||||||
center = lib.mkOption {
|
|
||||||
type = lib.types.nullOr lib.types.str;
|
|
||||||
default = "Switzerland";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
requestParams = lib.mkOption {
|
requestParams = lib.mkOption {
|
||||||
|
@ -33,41 +11,21 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
config = {
|
config = {
|
||||||
scripts = {
|
scripts.output = pkgs.writeShellApplication {
|
||||||
output = pkgs.writeShellApplication {
|
name = "map";
|
||||||
name = "map";
|
runtimeInputs = with pkgs; [
|
||||||
|
curl
|
||||||
|
imagemagick
|
||||||
|
];
|
||||||
|
|
||||||
runtimeInputs = with pkgs; [
|
text = ''
|
||||||
curl
|
convert <(${./map} ${lib.concatStringsSep " " config.requestParams}) sixel:-
|
||||||
imagemagick
|
'';
|
||||||
];
|
|
||||||
|
|
||||||
text = ''
|
|
||||||
convert <(${./map} ${lib.concatStringsSep " " config.requestParams}) sixel:-
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
geocode = pkgs.writeShellApplication {
|
|
||||||
name = "geocode";
|
|
||||||
|
|
||||||
runtimeInputs = with pkgs; [
|
|
||||||
curl
|
|
||||||
jq
|
|
||||||
];
|
|
||||||
|
|
||||||
text = ''exec ${./geocode} "$@"'';
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
requestParams = [
|
requestParams = [
|
||||||
"size=640x300"
|
"size=640x300"
|
||||||
"scale=2"
|
"scale=2"
|
||||||
(lib.mkIf (config.map.zoom != null)
|
|
||||||
"zoom=${toString config.map.zoom}")
|
|
||||||
(lib.mkIf (config.map.center != null)
|
|
||||||
"center=\"${config.scripts.geocode}/bin/geocode ${
|
|
||||||
lib.escapeShellArg config.map.center
|
|
||||||
}\"")
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
53
geocode
53
geocode
|
@ -1,53 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
cachedir=~/.cache/google-api/geocode
|
|
||||||
mkdir -p "$cachedir"
|
|
||||||
hash=$(echo "$1" | sha256sum - | cut -d' ' -f1)
|
|
||||||
cachefile="$cachedir/$hash"
|
|
||||||
|
|
||||||
if [[ ! -f "$cachefile" ]]; then
|
|
||||||
|
|
||||||
keyFile=${XDG_DATA_HOME:-~/.local/share}/google-api/key
|
|
||||||
|
|
||||||
if [[ ! -f "$keyFile" ]]; then
|
|
||||||
mkdir -p "$(basename "$keyFile")"
|
|
||||||
echo "No Google API key found in $keyFile" >&2
|
|
||||||
echo "For getting one, see https://developers.google.com/maps/documentation/geocoding/overview#before-you-begin" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
key=$(cat "$keyFile")
|
|
||||||
|
|
||||||
|
|
||||||
tmp=$(mktemp -d)
|
|
||||||
trap 'rm -rf "$tmp"' exit
|
|
||||||
|
|
||||||
output=$tmp/output
|
|
||||||
|
|
||||||
curlArgs=(
|
|
||||||
https://maps.googleapis.com/maps/api/geocode/json
|
|
||||||
--silent --show-error --get --output "$output" --write-out '%{http_code}'
|
|
||||||
--data-urlencode address="$1"
|
|
||||||
)
|
|
||||||
|
|
||||||
#echo curl ''${curlArgs[@]@Q} >&2
|
|
||||||
|
|
||||||
curlArgs+=(--data-urlencode key="$key")
|
|
||||||
|
|
||||||
if status=$(curl "${curlArgs[@]}"); then
|
|
||||||
if [[ "$status" == 200 ]]; then
|
|
||||||
jq -r '.results[0].geometry.location as $loc | "\($loc | .lat),\($loc | .lng)"' "$output" > "$cachefile"
|
|
||||||
else
|
|
||||||
echo "API returned non-200 HTTP status code $status, output is" >&2
|
|
||||||
cat "$output" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
code=$?
|
|
||||||
echo "curl exited with code $code" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
cat "$cachefile"
|
|
45
marker.nix
45
marker.nix
|
@ -1,45 +0,0 @@
|
||||||
{ lib, config, ... }:
|
|
||||||
let
|
|
||||||
markerType = lib.types.submodule {
|
|
||||||
options = {
|
|
||||||
location = lib.mkOption {
|
|
||||||
type = lib.types.nullOr lib.types.str;
|
|
||||||
default = null;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
in
|
|
||||||
{
|
|
||||||
options = {
|
|
||||||
map.markers = lib.mkOption {
|
|
||||||
type = lib.types.listOf markerType;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = {
|
|
||||||
map = {
|
|
||||||
markers = [
|
|
||||||
{ location = "Switzerland"; }
|
|
||||||
{ location = "New York"; }
|
|
||||||
];
|
|
||||||
|
|
||||||
center = lib.mkIf
|
|
||||||
(lib.length config.map.markers >= 1)
|
|
||||||
null;
|
|
||||||
|
|
||||||
zoom = lib.mkIf
|
|
||||||
(lib.length config.map.markers >= 2)
|
|
||||||
null;
|
|
||||||
};
|
|
||||||
|
|
||||||
requestParams =
|
|
||||||
let
|
|
||||||
paramsForMarkers = builtins.map
|
|
||||||
(marker: "$(${config.scripts.geocode}/bin/geocode ${
|
|
||||||
lib.escapeShellArg marker.location})")
|
|
||||||
config.map.markers;
|
|
||||||
in [
|
|
||||||
"markers=\"${lib.concatStringsSep "|" paramsForMarkers}\""
|
|
||||||
];
|
|
||||||
};
|
|
||||||
}
|
|
Loading…
Reference in a new issue