gocnab implements encoding and decoding of CNAB (Centro Nacional de Automação Bancária) data as defined by FEBRABAN.
When marshaling it is possible to inform a struct, that will generate 1 CNAB
line, or a slice of struct to generate multiple CNAB lines. On unmarshal a
pointer to a struct, a pointer to a slice of struct or a mapper
(map[string]interface{}
for a full CNAB file) should be used.
The library use struct tags to define the position of the field in the CNAB
content [begin,end)
. It supports the basic attribute types string
(uppercase
and left align), bool
(represented by 1
or 0
), int
, int8
, int16
,
int32
, int64
, uint
, uint8
, uint16
, uint23
, uint64
, float32
and
float64
(decimal separator removed). And for custom types it is possible to
implement gocnab.Marshaler
, gocnab.Unmarshaler
, encoding.TextMarshaler
and
encoding.TextUnmarshaler
to make full use of this library.
go get -u github.com/rafaeljusto/gocnab
For working with only a single line of the CNAB file:
package main
import "github.com/rafaeljusto/gocnab"
type example struct {
FieldA int `cnab:"0,20"`
FieldB string `cnab:"20,50"`
FieldC float64 `cnab:"50,60"`
FieldD uint `cnab:"60,70"`
FieldE bool `cnab:"70,71"`
}
func main() {
e1 := example{
FieldA: 123,
FieldB: "THIS IS A TEST",
FieldC: 50.30,
FieldD: 445,
FieldE: true,
}
data, err := gocnab.Marshal400(e1)
if err != nil {
println(err)
return
}
var e2 example
if err = gocnab.Unmarshal(data, &e2); err != nil {
println(err)
return
}
println(e1 == e2)
}
And for the whole CNAB file:
package main
import "github.com/rafaeljusto/gocnab"
type header struct {
Identifier string `cnab:"0,1"`
HeaderA int `cnab:"1,5"`
}
type content struct {
Identifier string `cnab:"0,1"`
FieldA int `cnab:"1,20"`
FieldB string `cnab:"20,50"`
FieldC float64 `cnab:"50,60"`
FieldD uint `cnab:"60,70"`
FieldE bool `cnab:"70,71"`
}
type footer struct {
Identifier string `cnab:"0,1"`
FooterA string `cnab:"5,30"`
}
func main() {
h1 := header{
Identifier: "0",
HeaderA: 2,
}
c1 := []content{
{
Identifier: "1",
FieldA: 123,
FieldB: "THIS IS A TEXT",
FieldC: 50.30,
FieldD: 445,
FieldE: true,
},
{
Identifier: "1",
FieldA: 321,
FieldB: "THIS IS ANOTHER TEXT",
FieldC: 30.50,
FieldD: 544,
FieldE: false,
},
}
f1 := footer{
Identifier: "2",
FooterA: "FINAL TEXT",
}
data, err := gocnab.Marshal400(h1, c1, f1)
if err != nil {
println(err)
return
}
var h2 header
var c2 []content
var f2 footer
if err = gocnab.Unmarshal(data, map[string]interface{}{
"0": &h2,
"1": &c2,
"2": &f2,
}); err != nil {
println(err)
return
}
println(h1 == h2)
for i := range c1 {
println(c1[i] == c2[i])
}
println(f1 == f2)
}