返回 DeepSeek-Reasonix
currency.go
根目录 / internal / cli / currency.go
1 package cli
2
3 import (
4 "fmt"
5 "strings"
6
7 tea "charm.land/bubbletea/v2"
8
9 "reasonix/internal/config"
10 "reasonix/internal/i18n"
11 )
12
13 func (m *chatTUI) runCurrencySubcommand(input string) tea.Cmd {
14 args := tokenizeArgs(input)
15 if len(args) < 2 {
16 cfg, err := config.Load()
17 if err != nil {
18 m.notice("currency: " + err.Error())
19 return nil
20 }
21 cfg.ApplyRuntimeAutoPricingCurrency(cliAutoPricingCurrency())
22 m.notice(i18n.M.CurrencyHeader + "\n" + describePricingCurrencies(pricingCurrencyDisplay(cfg.DesktopCurrency()), cfg.DeepSeekOfficialPricingCurrency()) + "\n" + i18n.M.CurrencyHint)
23 return nil
24 }
25 if len(args) > 2 {
26 m.notice(i18n.M.CurrencyHint)
27 return nil
28 }
29 mode, err := parseCLIPricingCurrency(args[1])
30 if err != nil {
31 m.notice(err.Error())
32 return nil
33 }
34 if !m.runtimeSettingChangeReady() {
35 return nil
36 }
37
38 path := config.UserConfigPath()
39 if path == "" {
40 m.notice("currency: cannot resolve user config path")
41 return nil
42 }
43 var resolved string
44 if err := func() error {
45 unlock := config.LockUserConfigEdits()
46 defer unlock()
47 edit := config.LoadForEdit(path)
48 if err := edit.SetDesktopCurrency(mode); err != nil {
49 return err
50 }
51 resolved = edit.DeepSeekOfficialPricingCurrency()
52 if mode == "" && edit.DesktopLanguage() == "" {
53 resolved = cliAutoPricingCurrency()
54 }
55 return edit.SaveTo(path)
56 }(); err != nil {
57 m.notice("currency: " + err.Error())
58 return nil
59 }
60
61 success := fmt.Sprintf(i18n.M.CurrencyChangedFmt, pricingCurrencyDisplay(mode), resolved)
62 if m.ctrl == nil {
63 m.notice(success)
64 return nil
65 }
66 return m.scheduleCurrentControllerRebuild("currency", success)
67 }
68
69 func parseCLIPricingCurrency(value string) (string, error) {
70 switch strings.ToUpper(strings.TrimSpace(value)) {
71 case "", "AUTO":
72 return "", nil
73 case "CNY":
74 return "CNY", nil
75 case "USD":
76 return "USD", nil
77 default:
78 return "", fmt.Errorf("pricing currency %q: must be auto|CNY|USD", value)
79 }
80 }
81
82 func pricingCurrencyDisplay(currency string) string {
83 if strings.TrimSpace(currency) == "" {
84 return "auto"
85 }
86 return strings.ToUpper(strings.TrimSpace(currency))
87 }
88
89 func describePricingCurrencies(current, resolved string) string {
90 items := []string{"auto", "CNY", "USD"}
91 var b strings.Builder
92 for _, item := range items {
93 marker := " "
94 if item == current {
95 marker = "• "
96 }
97 hint := ""
98 if item == "auto" {
99 hint = " (" + resolved + ")"
100 }
101 fmt.Fprintf(&b, "%s%s%s\n", marker, item, hint)
102 }
103 return strings.TrimRight(b.String(), "\n")
104 }
105
105 lines GO