diff options
| author | Murilo Ijanc <[email protected]> | 2026-07-27 20:25:04 -0300 |
|---|---|---|
| committer | Murilo Ijanc <[email protected]> | 2026-07-27 20:53:07 -0300 |
| commit | 82d92ed4291663bae94014b4363064dbb26c6a51 (patch) | |
| tree | 69d91a59c955f1e6ec6fc0007324b5d73b3f0d01 /README.md | |
| parent | 8e719fc715eb7ae9aa1c842e633f15b5c6cd3688 (diff) | |
| download | dart-3f63360ff982ef2a932eca814fdd74d4cb4b1de9.tar.gz | |
A CEP that fails a lookup is rarely a random number: it is usually someone
who knows the city and guessed the digits, and the classic guess is the
-000 that 957 municipalities never received. The API now attaches a faixa
block to the 404 naming the municipality that band belongs to, so the
caller can answer "no, but you were looking at Areal/RJ" instead of just
"no".
It stays an error. Faixa hangs off CepNotFoundException, never off Address,
and cepIni/cepFim are the extremes that actually exist in the municipality
rather than the range the Correios publish — echoing back the published
start would return the very CEP that just failed. The interval is sparse,
which is what ceps is for; it is not a list of alternatives.
Parsing is deliberately forgiving: a missing, empty or malformed block is
null. Losing a clean not-found to a parse error over the hint attached to
it would be a bad trade.
Diffstat (limited to 'README.md')
| -rw-r--r-- | README.md | 42 |
1 files changed, 42 insertions, 0 deletions
@@ -204,6 +204,48 @@ try { `RateLimitedException` exposes `retryAfter`, `ServerException` exposes `status`, and `NetworkException` exposes `cause`. +### When the CEP does not exist + +A failing CEP is rarely random: it is usually someone who knows the city and +guessed the number — and the classic guess is the `-000`, which 957 +municipalities never received. So `CepNotFoundException` may carry a `faixa` +naming the municipality the CEP *would* have belonged to: + +```dart +try { + final address = await cepis.lookup('25845-000'); +} on cepis.CepNotFoundException catch (e) { + final faixa = e.faixa; + if (faixa != null) { + faixa.localidade; // 'Areal' + faixa.uf; // 'RJ' + faixa.ibge; // '3300225' + faixa.cepIni; // '25845001' (the API's `cep_ini`) + faixa.cepFim; // '25849899' (the API's `cep_fim`) + faixa.ceps; // 118 + } +} +``` + +Three things this is not: + +- **Not an address.** The response is still a 404 and the CEP still does not + exist. `faixa` is context for the error — enough to say "did you mean somewhere + in Areal/RJ?" — and never a value to save as the user's address. +- **Not the Correios' published range.** `cepIni` and `cepFim` are the smallest + and the largest CEP that *actually exist* in the municipality. The DNE's own + start for Areal is `25845000` — exactly the CEP that just failed, which is why + echoing it back would be useless. +- **Not a range of valid CEPs.** It is sparse: Areal's 118 CEPs are scattered + over the ~9000 numbers between the two bounds. That is what `ceps` is for. Do + not iterate the interval and do not offer it as a list of alternatives. + +`faixa` is `null` when the CEP falls in a numeric band no municipality owns — the +API **omits** the block there rather than sending null — and also whenever the +block cannot be read. A malformed one never costs you the clean not-found. + +`e.toString()` mentions the municipality when there is one. + `InvalidCepException` also implements `FormatException`, so code already handling malformed input during validation keeps working without knowing this library exists. |