app/validators/details/chunks.validator.ex

defmodule ExCnab.Cnab240.Validator.Details.Chunk do
  @moduledoc """
  An implementation of chain of responsibility to validate the chunks
  """

  @spec call(Map.t(), Map.t()) :: {:ok, Map.t()} | {:error, String.t(), String.t()}
  def call(details, raw_detail) do
    with :ok <- validate_length(raw_detail),
         :ok <- validate_details_length(details, raw_detail) do
      {:ok, details}
    end
  end

  @spec_length 10_000
  defp validate_length(raw_detail) do
    length = length(raw_detail)

    case length < @spec_length do
      true ->
        :ok

      false ->
        {:error,
         "Tamanho total do lote inválido: #{length}, não pode ser maior que #{@spec_length}}"}
    end
  end

  defp validate_details_length(details, raw_detail) do
    raw_length = length(raw_detail)
    length = length(details)

    case length == raw_length do
      true ->
        :ok

      false ->
        {:error, "Tamanho dos detalhes inválido: #{length}, esperado: #{raw_length},
         if you have this error, please contact the maintainers and open an issue"}
    end
  end
end