1// Package codabar can create Codabar barcodes
2package codabar
3
4import (
5	"fmt"
6	"regexp"
7
8	"github.com/boombuler/barcode"
9	"github.com/boombuler/barcode/utils"
10)
11
12var encodingTable = map[rune][]bool{
13	'0': []bool{true, false, true, false, true, false, false, true, true},
14	'1': []bool{true, false, true, false, true, true, false, false, true},
15	'2': []bool{true, false, true, false, false, true, false, true, true},
16	'3': []bool{true, true, false, false, true, false, true, false, true},
17	'4': []bool{true, false, true, true, false, true, false, false, true},
18	'5': []bool{true, true, false, true, false, true, false, false, true},
19	'6': []bool{true, false, false, true, false, true, false, true, true},
20	'7': []bool{true, false, false, true, false, true, true, false, true},
21	'8': []bool{true, false, false, true, true, false, true, false, true},
22	'9': []bool{true, true, false, true, false, false, true, false, true},
23	'-': []bool{true, false, true, false, false, true, true, false, true},
24	'$': []bool{true, false, true, true, false, false, true, false, true},
25	':': []bool{true, true, false, true, false, true, true, false, true, true},
26	'/': []bool{true, true, false, true, true, false, true, false, true, true},
27	'.': []bool{true, true, false, true, true, false, true, true, false, true},
28	'+': []bool{true, false, true, true, false, true, true, false, true, true},
29	'A': []bool{true, false, true, true, false, false, true, false, false, true},
30	'B': []bool{true, false, false, true, false, false, true, false, true, true},
31	'C': []bool{true, false, true, false, false, true, false, false, true, true},
32	'D': []bool{true, false, true, false, false, true, true, false, false, true},
33}
34
35// Encode creates a codabar barcode for the given content
36func Encode(content string) (barcode.Barcode, error) {
37	checkValid, _ := regexp.Compile(`[ABCD][0123456789\-\$\:/\.\+]*[ABCD]$`)
38	if content == "!" || checkValid.ReplaceAllString(content, "!") != "!" {
39		return nil, fmt.Errorf("can not encode \"%s\"", content)
40	}
41	resBits := new(utils.BitList)
42	for i, r := range content {
43		if i > 0 {
44			resBits.AddBit(false)
45		}
46		resBits.AddBit(encodingTable[r]...)
47	}
48	return utils.New1DCode(barcode.TypeCodabar, content, resBits), nil
49}
50