fix: propagate QR output failures
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
@@ -251,6 +252,19 @@ type longPollData struct {
|
||||
|
||||
type stringOrNumber string
|
||||
|
||||
type recordingWriter struct {
|
||||
w io.Writer
|
||||
err error
|
||||
}
|
||||
|
||||
func (writer *recordingWriter) Write(payload []byte) (int, error) {
|
||||
written, err := writer.w.Write(payload)
|
||||
if err != nil && writer.err == nil {
|
||||
writer.err = err
|
||||
}
|
||||
return written, err
|
||||
}
|
||||
|
||||
func (value *stringOrNumber) UnmarshalJSON(payload []byte) error {
|
||||
decoded, err := decodeStringOrNumber(payload)
|
||||
if err != nil {
|
||||
@@ -282,10 +296,18 @@ func (client *Client) Login(ctx context.Context) (AuthData, error) {
|
||||
if _, err := qr.Encode(loginData.LoginURL, qr.L); err != nil {
|
||||
return AuthData{}, fmt.Errorf("encode login QR code: %w", err)
|
||||
}
|
||||
fmt.Fprintf(client.qrWriter, "请使用米家APP扫描下方二维码\n%s\n", loginData.LoginURL)
|
||||
qrterminal.GenerateHalfBlock(loginData.LoginURL, qrterminal.L, client.qrWriter)
|
||||
writer := &recordingWriter{w: client.qrWriter}
|
||||
if _, err := fmt.Fprintf(writer, "请使用米家APP扫描下方二维码\n%s\n", loginData.LoginURL); err != nil {
|
||||
return AuthData{}, fmt.Errorf("write QR login output: %w", err)
|
||||
}
|
||||
qrterminal.GenerateHalfBlock(loginData.LoginURL, qrterminal.L, writer)
|
||||
if writer.err != nil {
|
||||
return AuthData{}, fmt.Errorf("write QR login output: %w", writer.err)
|
||||
}
|
||||
if loginData.QR != "" {
|
||||
fmt.Fprintf(client.qrWriter, "二维码图片: %s\n", loginData.QR)
|
||||
if _, err := fmt.Fprintf(writer, "二维码图片: %s\n", loginData.QR); err != nil {
|
||||
return AuthData{}, fmt.Errorf("write QR login output: %w", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
return client.completeQRLogin(ctx, loginData)
|
||||
|
||||
Reference in New Issue
Block a user