aboutsummaryrefslogtreecommitdiff
path: root/cmd/fx
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/fx')
-rwxr-xr-xcmd/fx44
1 files changed, 44 insertions, 0 deletions
diff --git a/cmd/fx b/cmd/fx
new file mode 100755
index 0000000..407c2d0
--- /dev/null
+++ b/cmd/fx
@@ -0,0 +1,44 @@
+#!/bin/sh
+# @fx - exchange rates between USD, EUR, PLN and THB (no arguments)
+#
+# One keyless request to open.er-api.com (base USD); the six cross-rates
+# are derived from it. JSON is parsed with awk so no 'jq' is needed.
+
+json=$(curl -fsS --max-time 8 "https://open.er-api.com/v6/latest/USD" \
+ | tr -d '\n\r') || { echo "fx: rate lookup failed"; exit 1; }
+
+case "$json" in
+ *'"result":"success"'*) ;;
+ *) echo "fx: rate service returned an error"; exit 1 ;;
+esac
+
+printf '%s' "$json" | awk '
+function rate(cur, s) {
+ if (match($0, "\"" cur "\":[0-9.]+")) {
+ s = substr($0, RSTART, RLENGTH)
+ sub(/^.*:/, "", s)
+ return s + 0
+ }
+ return -1
+}
+{
+ e = rate("EUR"); p = rate("PLN"); t = rate("THB")
+ if (e <= 0 || p <= 0 || t <= 0) {
+ print "fx: incomplete rate data"
+ exit 1
+ }
+ if (match($0, /"time_last_update_utc":"[^"]*"/)) {
+ d = substr($0, RSTART, RLENGTH)
+ sub(/^.*:"/, "", d)
+ sub(/"$/, "", d)
+ split(d, w, " ")
+ print "FX rates " w[1] " " w[2] " " w[3] " " w[4]
+ }
+ printf "1 USD = %.4g EUR\n", e
+ printf "1 USD = %.4g PLN\n", p
+ printf "1 USD = %.4g THB\n", t
+ printf "1 EUR = %.4g PLN\n", p / e
+ printf "1 EUR = %.4g THB\n", t / e
+ printf "1 PLN = %.4g THB\n", t / p
+}
+'