aboutsummaryrefslogtreecommitdiff
path: root/cmd/fx
blob: 407c2d0c9910c3a0aeb6fb42ea0315a52e2930e4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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
}
'