diff options
| author | Murilo Ijanc <[email protected]> | 2026-07-27 20:38:27 -0300 |
|---|---|---|
| committer | Murilo Ijanc <[email protected]> | 2026-07-27 20:38:27 -0300 |
| commit | 399eac351b1bc29d5047dbac96486c281be1b05c (patch) | |
| tree | 81151d5bf139f07096a8f38313d64482250163c2 /R/api.R | |
| parent | 11d49bc25eb1643f1b742f9527212d8781f2e0de (diff) | |
| download | r-399eac351b1bc29d5047dbac96486c281be1b05c.tar.gz | |
A CEP that fails a lookup is rarely a random number: it is usually someone
who knows the city and guessed, and the classic guess is the -000 that 957
municipalities never received. The API now answers those 404s with a faixa
naming the municipality that owns the band the number fell into, which is
the difference between telling a user "invalid CEP" and "no such CEP in
Areal/RJ".
It is context for an error and never an address, so it rides on the
cepis_not_found condition instead of turning the failure into a success,
and cep_ini/cep_fim are the endpoints that exist rather than the range the
Correios publish - the interval between them is sparse, which is what ceps
counts. Parsing is deliberately unable to signal: a faixa that is null, an
array, a string or half a body leaves a clean not-found behind, because the
caller asked for the CEP, not for the decoration on its absence.
Diffstat (limited to 'R/api.R')
| -rw-r--r-- | R/api.R | 16 |
1 files changed, 11 insertions, 5 deletions
@@ -13,7 +13,10 @@ #' @section Conditions: #' \describe{ #' \item{`cepis_invalid_cep`}{the CEP is not 8 digits. No request is made.} -#' \item{`cepis_not_found`}{well-formed, but not in the database.} +#' \item{`cepis_not_found`}{well-formed, but not in the database. Carries +#' `faixa`, a [cepis_faixa] naming the municipality whose range the CEP +#' fell into, when it fell into one. Still a not-found: the CEP does not +#' exist, and a `faixa` is not an address.} #' \item{`cepis_rate_limited`}{429 on every attempt.} #' \item{`cepis_server_error`}{5xx on every attempt.} #' \item{`cepis_network_error`}{the request never completed.} @@ -38,10 +41,13 @@ cep_lookup <- function(cep, client = default_client()) { response <- cepis_fetch(client, paste0("/", number)) if (response$status == 404L) { - stop(not_found_error( - paste0("CEP ", number, " does not exist in the DNE database"), - cep = number - )) + faixa <- new_faixa(json_field(response$body, "faixa")) + message <- paste0("CEP ", number, " does not exist in the DNE database") + if (!is.null(faixa)) { + message <- paste0(message, "; the range it falls in belongs to ", + faixa$localidade, "/", faixa$uf) + } + stop(not_found_error(message, cep = number, faixa = faixa)) } if (response$status == 400L) { stop(invalid_cep_error( |