diff --git a/txqr.go b/txqr.go new file mode 100644 index 0000000..d059c19 --- /dev/null +++ b/txqr.go @@ -0,0 +1,48 @@ +package txqr + +import ( + "fmt" + "image" + + "github.com/divan/txqr/protocol" + "github.com/divan/txqr/qr" +) + +func Encode(str string) (<-chan image.Image, error) { + size := 100 + chunks, err := protocol.NewEncoder(size).Encode(str) + if err != nil { + return nil, fmt.Errorf("encode: %v", err) + } + ch := make(chan image.Image) + + go func(ch chan<- image.Image) { + defer close(ch) + for _, chunk := range chunks { + img, err := qr.Encode(chunk, 512) + if err != nil { + // TODO: handle error better + fmt.Errorf("[ERROR] encode: %v", err) + continue + } + ch <- img + } + }(ch) + + return ch, nil +} + +func Decode(ch <-chan image.Image) (string, error) { + dec := protocol.NewDecoder() + for img := range ch { + chunk, err := qr.Decode(img) + if err != nil { + return "", fmt.Errorf("decode: %v", err) + } + err = dec.DecodeChunk(chunk) + if err != nil { + return "", fmt.Errorf("decode chunk: %v", err) + } + } + return dec.Data(), nil +} diff --git a/txqr_test.go b/txqr_test.go new file mode 100644 index 0000000..bf682bf --- /dev/null +++ b/txqr_test.go @@ -0,0 +1,18 @@ +package txqr + +import "testing" + +func TestTXQR(t *testing.T) { + str := "hello, world!" + ch, err := Encode(str) + if err != nil { + t.Fatalf("Encode failed: %v", err) + } + got, err := Decode(ch) + if err != nil { + t.Fatalf("Decode failed: %v", err) + } + if got != str { + t.Fatalf("Expected '%s', but got '%s'", str, got) + } +}