defmodule ExCnab.Cnab240.Validator.Details.ChunkHeader do @moduledoc """ An implementation of chain of responsibility to validate the chunk header. """ @spec call(Map.t(), Map.t()) :: {:ok, Map.t()} | {:error, String.t(), String.t()} def call(builded_header, raw_header) do with :ok <- validate_length(raw_header), :ok <- chunk_layout_version(builded_header.servico.layout_lote), :ok <- validate_record_type(builded_header.controle.registro) do {:ok, builded_header} else {:error, reason} -> {:error, reason, raw_header} end end @spec_length 240 defp validate_length(raw_header) do case String.length(raw_header) do @spec_length -> :ok number -> {:error, "Tamanho do header do lote inválido: #{number}, esperado: #{@spec_length}}"} end end @layout_chunk_version "042" defp chunk_layout_version(layout) do case layout === @layout_chunk_version do true -> :ok _ -> {:error, "Versão do layout do lote inválida: #{layout}, esperado: #{@layout_chunk_version}"} end end @record_type "1" defp validate_record_type(record_type) do case record_type == @record_type do true -> :ok false -> {:error, "Tipo de registro inválido: #{record_type}, esperado: #{@record_type}"} end end end