mirror of
https://github.com/divan/txqr.git
synced 2026-08-29 22:38:04 +08:00
Add txqr package
This commit is contained in:
@@ -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
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user