1package config
2
3import (
4 "cmp"
5 "context"
6 "log/slog"
7 "testing"
8
9 "github.com/charmbracelet/crush/internal/oauth"
10 "github.com/charmbracelet/crush/internal/oauth/copilot"
11)
12
13func (c *Config) importCopilot() (*oauth.Token, bool) {
14 if testing.Testing() {
15 return nil, false
16 }
17
18 if c.HasConfigField("providers.copilot.api_key") || c.HasConfigField("providers.copilot.oauth") {
19 return nil, false
20 }
21
22 diskToken, hasDiskToken := copilot.RefreshTokenFromDisk()
23 if !hasDiskToken {
24 return nil, false
25 }
26
27 slog.Info("Found existing GitHub Copilot token on disk. Authenticating...")
28 token, err := copilot.RefreshToken(context.TODO(), diskToken)
29 if err != nil {
30 slog.Error("Unable to import GitHub Copilot token", "error", err)
31 return nil, false
32 }
33
34 if err := cmp.Or(
35 c.SetConfigField("providers.copilot.api_key", token.AccessToken),
36 c.SetConfigField("providers.copilot.oauth", token),
37 ); err != nil {
38 slog.Error("Unable to save GitHub Copilot token to disk", "error", err)
39 }
40
41 slog.Info("GitHub Copilot successfully imported")
42 return token, true
43}