ISO8583(MasterC and PROSA) parser for ELIXIR language .
Elixir 1.5+.
If available in Hex, the package can be installed
by adding ale8583
to your list of dependencies in mix.exs
:
def deps do
[
{:ale8583, "~> 0.1.1"}
]
end
A ISO tuple is the main idea, just like that :
{:iso,listISO,{listBitMapP,listBitMapS,flagBMSec,listISOconf},{status, message}}
Where:
“:iso” : Atom static.
“listISO” : Elixir List for fields [ bp: “..” , c1: “…“, c2: “…” …]
Atom Fields:
:c2 to :c128 => ISO FIELDS.
:bp => Primary bit MAP.
:bs = > Secondary bit MAP.
“listBitMapP” : Elixir List fields [ c1: 0 , c2: 1 …]
Atom fields:
:c1 to c64 => 0 or 1
“listBitMapS” : Elixir List fields [ c65: 0 , c128: 1 …]
Atom fields:
:c65 to c128 => 0 or 1
“flagBMSec” : true => If secondary bit map is present
false => any other else
“listISOconf” : ISO configuration from iso.conf.
{ status , message } : It’s the result for a back step operation.
“status” : :ok or :error
“message” : “Message string detail”
test "list to iso type :prosa" do
listRAW='ISO0060000400800822000000000000004000000000000000804180203010449101'
strHeadProsa=Enum.take(listRAW,12) |> List.to_string #String.slice(data,0,12)
Logger.debug "Header PROSA : #{strHeadProsa} "
## MTI
strMTI= Enum.slice(listRAW, 12 ,4 ) |> List.to_string
## BIT MAP PRIMARY
strBitMap=Enum.slice(listRAW, 16,16 ) |> List.to_string
## BIT MAP IF TRANSACTION HAS BIT MAP SECONDARY
strBitMap =
if Ale8583.haveBitMapSec?(strBitMap) == true do
Enum.slice(listRAW,16,32) |> List.to_string
else
strBitMap
end
## TAKE FIELDS SINCE FIELD 1.
listFields= Enum.take(listRAW, 32 - Kernel.length(listRAW))
## ISO MAKES FROM MTI AND CONFIGURATION FILE.
isoMTI=Ale8583.new_with_out_conf({strMTI,"/Users/ale/testPrograms/ale8583/ale8583/ascii.iso.cfg"})
{:iso,listISO,{listBitMapP,listBitMapS,flagBMSec,listISOconf},{status, message}} = isoMTI
Logger.info "Result : #{inspect status} #{inspect message}"
assert status == :ok
#Logger.info "#{inspect isoMTI} "
Logger.info "#{inspect strBitMap}, #{inspect listFields}, #{inspect strHeadProsa} "
isoMTI= Ale8583.list_to_iso({strBitMap,listFields, :prosa ,strHeadProsa}, isoMTI)
{:iso,listISO,{listBitMapP,listBitMapS,flagBMSec,listISOconf},{status, message}} = isoMTI
## INSPECT RESULT :ok or :error
Logger.info "Result : #{inspect status} #{inspect message}"
assert status == :ok
Ale8583.printAll(isoMTI, "Print fields ISO type #{strMTI}:")
# VALIDATE FIELDS CONTENT
assert List.keymember?(listISO, :c1, 0) == true
assert List.keymember?(listISO, :c7, 0) == true
assert List.keymember?(listISO, :c11, 0) == true
assert List.keymember?(listISO, :c70, 0) == true
#{ _ , strC3 } = List.keyfind( listISO , :c3 ,0)
#assert "111000" == strC3
{ _ , strBMP } = List.keyfind( listISO , :bp ,0)
assert "8220000000000000" == strBMP
Logger.info "Result : #{inspect status} #{inspect message}"
assert status == :ok
end
Output:
Finished in 0.1 seconds
3 doctests, 4 tests, 0 failures
ETH : 0x3377c57bde7af7247786ded97aa2549b79b0e129