ApiBrasil.Core.Utils (APIBrasil v0.0.1)

Copy Markdown View Source

Utilidades compartilhadas: montagem de URL, query string, normalização de headers e conversão de bodies.

Summary

Functions

Monta a query string a partir de um mapa/keyword, ignorando valores nulos.

Codifica um segmento de caminho de URL (mantém /).

Junta a base da API com o caminho, sem barras duplicadas.

Mescla dois conjuntos de headers sem diferenciar maiúsculas de minúsculas — os de override vencem, inclusive quando só a caixa difere.

Normaliza headers para um mapa %{"nome" => "valor"}, preservando o nome original mas removendo duplicatas por comparação sem diferenciar caixa.

Devolve nil para strings vazias — credenciais vazias contam como ausentes.

Converte as chaves de um mapa (um nível) em strings — aceita átomos e strings misturados.

Normaliza o corpo de uma requisição.

Normaliza a resposta em um mapa JSON.

Functions

build_query_string(query)

@spec build_query_string(map() | keyword() | nil) :: String.t()

Monta a query string a partir de um mapa/keyword, ignorando valores nulos.

As chaves saem ordenadas, o que torna a URL determinística. Devolve "" quando não há nada a enviar.

iex> ApiBrasil.Core.Utils.build_query_string(%{"search" => "cep", "page" => 2})
"?page=2&search=cep"

encode_path(value)

@spec encode_path(String.t()) :: String.t()

Codifica um segmento de caminho de URL (mantém /).

join_url(base_url, path)

@spec join_url(String.t(), String.t()) :: String.t()

Junta a base da API com o caminho, sem barras duplicadas.

iex> ApiBrasil.Core.Utils.join_url("https://gateway.apibrasil.io/api/v2/", "/whatsapp/sendText")
"https://gateway.apibrasil.io/api/v2/whatsapp/sendText"

merge_headers(base, override)

@spec merge_headers(map(), map()) :: map()

Mescla dois conjuntos de headers sem diferenciar maiúsculas de minúsculas — os de override vencem, inclusive quando só a caixa difere.

normalize_headers(headers)

@spec normalize_headers(map() | keyword() | nil) :: map()

Normaliza headers para um mapa %{"nome" => "valor"}, preservando o nome original mas removendo duplicatas por comparação sem diferenciar caixa.

presence(value)

@spec presence(term()) :: term()

Devolve nil para strings vazias — credenciais vazias contam como ausentes.

stringify_keys(map)

@spec stringify_keys(map()) :: map()

Converte as chaves de um mapa (um nível) em strings — aceita átomos e strings misturados.

to_body(consulta)

@spec to_body(term()) :: map() | list() | nil

Normaliza o corpo de uma requisição.

Aceita mapas, keyword lists, structs ApiBrasil.Consulta, nil e [] — devolve um mapa ou nil quando não há corpo.

to_json_object(value)

@spec to_json_object(term()) :: map()

Normaliza a resposta em um mapa JSON.

Respostas vazias viram %{}; respostas que não são objetos (listas, texto) são embrulhadas em %{"data" => ...}.