Skip to content

Commit

Permalink
Send qr code to a writer
Browse files Browse the repository at this point in the history
  • Loading branch information
moncho committed Dec 2, 2017
1 parent c0fc8eb commit 381bcc3
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 16 deletions.
4 changes: 2 additions & 2 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,13 @@ func main() {
}

var wifQR bytes.Buffer
if err := qr.Encode(wif, &wifQR); err != nil {
if err := qr.Copy(&wifQR, strings.NewReader(wif)); err != nil {
fmt.Printf("Could not generate QR code for WIF: %s", err.Error())
os.Exit(-1)
}
var pubAddressQR bytes.Buffer

if err := qr.Encode(pubAddress, &pubAddressQR); err != nil {
if err := qr.Copy(&pubAddressQR, strings.NewReader(pubAddress)); err != nil {
fmt.Printf("Could not generate QR code for pubAddress: %s", err.Error())
os.Exit(-1)
}
Expand Down
49 changes: 36 additions & 13 deletions qr/encode.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,59 +2,82 @@ package qr

import (
"io"
"io/ioutil"

"rsc.io/qr"
)

const blackSquare = "\033[40m \033[0m"
const whiteSquare = "\033[47m \033[0m"

var newLine = []byte("\n")

type encodingParams struct {
Level qr.Level
Reader io.Reader
Writer io.Writer
BlackChar string
WhiteChar string
}

//Creates a QR that can be displayed on a terminal
func encode(text string, params encodingParams) error {
func encode(params encodingParams) error {
w := params.Writer
white := params.WhiteChar
black := params.BlackChar
var text string

if b, err := ioutil.ReadAll(params.Reader); err == nil {
text = string(b)
} else {
return err
}
code, err := qr.Encode(text, params.Level)

if err != nil {
return err
}

w.Write([]byte(white))
textVersion := qrToText(code, []byte(white), []byte(black))
_, err = w.Write(textVersion)
return err
}

func qrToText(code *qr.Code, white, black []byte) []byte {

textVersion := white
for i := 0; i <= code.Size; i++ {
w.Write([]byte(white))
textVersion = append(textVersion, white...)
}
w.Write([]byte("\n"))
textVersion = append(textVersion, newLine...)

for i := 0; i <= code.Size; i++ {
w.Write([]byte(white))
textVersion = append(textVersion, white...)
for j := 0; j <= code.Size; j++ {
if code.Black(i, j) {
w.Write([]byte(black))
textVersion = append(textVersion, black...)
} else {
w.Write([]byte(white))
textVersion = append(textVersion, white...)
}
}
w.Write([]byte("\n"))
textVersion = append(textVersion, newLine...)
}
return err

textVersion = append(textVersion, newLine...)
return textVersion
}

//Encode encodes the given text as a QR code, the QR is written
//on the given writer
func Encode(text string, w io.Writer) error {
//Copy encodes the given reader as a QR code in text mode and copies it
//to the given writer
func Copy(w io.Writer, r io.Reader) error {

//func Encode(text string, w io.Writer) error {
params := encodingParams{
Level: qr.L,
Reader: r,
Writer: w,
BlackChar: blackSquare,
WhiteChar: whiteSquare,
}
return encode(text, params)
return encode(params)
}
3 changes: 2 additions & 1 deletion qr/encode_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package qr

import (
"bytes"
"strings"
"testing"
)

Expand All @@ -23,7 +24,7 @@ func TestQRWritingDoesNotFail(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
w := &bytes.Buffer{}
if err := Encode(tt.args.text, w); (err != nil) != tt.wantErr {
if err := Copy(w, strings.NewReader(tt.args.text)); (err != nil) != tt.wantErr {
t.Errorf("Encode() error = %v, wantErr %v", err, tt.wantErr)
}

Expand Down

0 comments on commit 381bcc3

Please sign in to comment.