tokens, err := a.read()
if err != nil {
- return err
+ return fmt.Errorf("read login tokens: %w", err)
}
expiry, found := chatgptTokenExpiry(tokens.AccessToken)
if !found || !time.Now().Before(expiry.Add(-chatgptRefreshMargin)) {
tokens, err = a.refresh(ctx, tokens)
if err != nil {
- return err
+ return fmt.Errorf("refresh login tokens: %w", err)
}
}
err = a.write(tokens)
if err != nil {
- return ChatGPTTokenFile{}, err
+ return ChatGPTTokenFile{}, fmt.Errorf("save refreshed tokens: %w", err)
}
return tokens, nil
}
_, err = a.post(ctx, path, "application/json", data, result)
+ if err != nil {
+ return fmt.Errorf("post JSON request: %w", err)
+ }
- return err
+ return nil
}
// write replaces the token file atomically. The file has mode 0600.
grant, err := a.poll(ctx, code.DeviceAuthID, userCode, chatgptPollInterval(code.Interval))
if err != nil {
- return err
+ return fmt.Errorf("wait for device grant: %w", err)
}
tokens, err := a.exchange(ctx, grant)
if err != nil {
- return err
+ return fmt.Errorf("exchange device grant: %w", err)
}
err = a.write(tokens)
if err != nil {
- return err
+ return fmt.Errorf("save login tokens: %w", err)
}
_, err = fmt.Fprintln(out, "Logged in.")
func chatgptLogin(ctx context.Context, out io.Writer) (err error) {
dir, err := dataDir()
if err != nil {
- return err
+ return fmt.Errorf("find data directory: %w", err)
}
tokens, err := lockTokens(dir)
if err != nil {
- return err
+ return fmt.Errorf("lock login tokens: %w", err)
}
defer func() {