package services import ( "bytes" "fmt" "image/png" "slices" "github.com/boombuler/barcode" "github.com/boombuler/barcode/code128" "github.com/boombuler/barcode/ean" "github.com/boombuler/barcode/qr" ) type BarcodeGenerator interface { GenerateBarcode(format string, content string) (bytes.Buffer, error) IsTypeSupported(format string) bool } type DefaultBarcodeGenerator struct { } func (b *DefaultBarcodeGenerator) GenerateBarcode(format string, content string, width int, height int) (bytes.Buffer, error) { if !b.IsTypeSupported(format) { return bytes.Buffer{}, fmt.Errorf("unsupported barcode type: %s", format) } var generatedCode barcode.Barcode var err error switch format { case "ean13": generatedCode, err = ean.Encode(content) if err != nil { return bytes.Buffer{}, err } break case "code128": generatedCode, err = code128.Encode(content) if err != nil { return bytes.Buffer{}, err } break case "qr": generatedCode, err = qr.Encode(content, qr.M, qr.AlphaNumeric) if err != nil { return bytes.Buffer{}, err } break } scaledCode, err := barcode.Scale(generatedCode, width, height) if err != nil { return bytes.Buffer{}, err } var buf bytes.Buffer err = png.Encode(&buf, scaledCode) if err != nil { return bytes.Buffer{}, err } return buf, nil } func (b *DefaultBarcodeGenerator) IsTypeSupported(format string) bool { supportedTypes := []string{"ean13", "code128", "qr"} return slices.Contains(supportedTypes, format) }