package services import ( "bytes" "encoding/base64" "errors" "html/template" "image/png" "github.com/boombuler/barcode" "github.com/boombuler/barcode/code128" "github.com/boombuler/barcode/ean" "github.com/boombuler/barcode/qr" ) type Templater interface { Execute(template *template.Template, data interface{}) (string, error) StringToTemplate(templateString string) (*template.Template, error) } type DefaultTemplater struct { } func idToEan13(id string, prefix string) (string, error) { if len(id) > 12 { return "", errors.New("id too long") } for len(id) < 11 { id = "0" + id } id = prefix + id return id, nil } func (t *DefaultTemplater) GenerateBarcode(code string, format string, prefix string) (string, error) { var generatedCode barcode.Barcode var err error switch format { case "ean13": encodedEan, err := idToEan13(code, prefix) if err != nil { return "", err } generatedCode, err = ean.Encode(encodedEan) if err != nil { return "", err } break case "code128": generatedCode, err = code128.Encode(prefix + code) if err != nil { return "", err } break case "qr": generatedCode, err = qr.Encode(prefix+code, qr.M, qr.AlphaNumeric) if err != nil { return "", err } break default: return "", errors.New("unknown barcode format") } scaledCode, err := barcode.Scale(generatedCode, 1000, 500) if err != nil { return "", err } var buf bytes.Buffer err = png.Encode(&buf, scaledCode) if err != nil { return "", err } return base64.StdEncoding.EncodeToString(buf.Bytes()), nil } func (t *DefaultTemplater) StringToTemplate(templateString string) (*template.Template, error) { return template.New("template").Funcs(template.FuncMap{ "barcode": t.GenerateBarcode, "sponsorLogo": func(id int) string { return "a" }, }).Parse(templateString) } func (t *DefaultTemplater) Execute(baseTemplate *template.Template, data interface{}) (string, error) { resultBuffer := new(bytes.Buffer) err := baseTemplate.Execute(resultBuffer, data) if err != nil { return "", err } return resultBuffer.String(), nil }