fix: propagate QR output failures

This commit is contained in:
2026-07-20 14:06:51 +08:00
parent 43c688af6f
commit 8fea0c3c11
2 changed files with 68 additions and 3 deletions
+25 -3
View File
@@ -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)