blob: 867a01f8d8f0a0270bed2ca204d846193559bd64 [file] [log] [blame]
/// Prints currency exchange table using www.floatrates.com.
import 'dart:convert';
import 'dart:io';
import 'package:xml/xml.dart';
final HttpClient httpClient = HttpClient();
void writeCell([Object? output]) {
final contents = output?.toString() ?? '';
stdout.write(contents.padLeft(14, ' '));
stdout.write(' ');
}
Future<void> main(List<String> arguments) async {
if (arguments.isEmpty) {
stdout.writeln('Example: currencies EUR CHF ...');
exit(1);
}
final currencies =
arguments.map((argument) => argument.trim().toLowerCase()).toSet();
writeCell();
currencies.forEach(writeCell);
stdout.writeln();
for (final sourceCurrency in currencies) {
final url = 'https://www.floatrates.com/daily/$sourceCurrency.xml';
final request = await httpClient.getUrl(Uri.parse(url));
final response = await request.close();
final stream = response.transform(utf8.decoder);
final contents = await stream.join();
final document = XmlDocument.parse(contents);
writeCell(sourceCurrency);
for (final targetCurrency in currencies) {
if (sourceCurrency == targetCurrency) {
writeCell();
} else {
writeCell(document.rootElement
.findElements('item')
.where((item) => item.findElements('targetCurrency').any(
(element) => element.innerText.toLowerCase() == targetCurrency))
.first
.findElements('exchangeRate')
.first
.innerText);
}
}
stdout.writeln();
}
}