/// Command-line entry point: resolve CEPs from a terminal. /// /// ```sh /// dart run cepis 01001000 /// dart run cepis --base-url http://localhost:8080 01001000 20040020 /// ``` library; import 'dart:convert'; import 'dart:io'; import 'package:cepis/cepis.dart'; const String _usage = ''' usage: cepis [--base-url URL] [--health] [CEP...] --base-url URL where the API lives (default $defaultBaseUrl) --health report the API's health instead of looking anything up -h, --help show this message One CEP prints the full record, coordinate included. Several go through the batch endpoint, which carries no coordinate.'''; Future run(List arguments) async { var baseUrl = defaultBaseUrl; var wantHealth = false; final ceps = []; for (var i = 0; i < arguments.length; i++) { final argument = arguments[i]; if (argument == '-h' || argument == '--help') { stdout.writeln(_usage); return 0; } else if (argument == '--health') { wantHealth = true; } else if (argument == '--base-url') { if (i + 1 >= arguments.length) { stderr.writeln('cepis: --base-url needs a value'); return 2; } baseUrl = arguments[++i]; } else if (argument.startsWith('-')) { stderr.writeln('cepis: unknown option $argument'); return 2; } else { ceps.add(argument); } } if (!wantHealth && ceps.isEmpty) { stderr.writeln(_usage); return 2; } final client = Client(baseUrl: baseUrl); try { if (wantHealth) { final report = await client.health(); stdout.writeln(_encode(report.raw)); return report.ok ? 0 : 1; } if (ceps.length == 1) { final address = await client.lookup(ceps.single); stdout.writeln(_encode(address.raw)); return 0; } final result = await client.lookupMany(ceps); for (var i = 0; i < ceps.length; i++) { final address = result[i]; stdout.writeln( address == null ? '${ceps[i]}\tnot found' : '${ceps[i]}\t${address.logradouro}\t${address.localidade}\t' '${address.uf}', ); } return 0; } on CepisException catch (error) { stderr.writeln('cepis: ${error.message}'); return 1; } finally { client.close(); } } String _encode(Map data) => const JsonEncoder.withIndent(' ').convert(data); Future main(List arguments) async { exitCode = await run(arguments); }