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
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"
Codifica um segmento de caminho de URL (mantém /).
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"
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.
Aceita mapas, keyword lists, structs ApiBrasil.Consulta, nil e [] —
devolve um mapa ou nil quando não há corpo.
Normaliza a resposta em um mapa JSON.
Respostas vazias viram %{}; respostas que não são objetos (listas, texto)
são embrulhadas em %{"data" => ...}.