返回 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 m.notice(i18n.M.CurrencyHeader + "\n" + describePricingCurrencies(pricingCurrencyDisplay(cfg.DisplayCurrencyPref()), cfg.ResolveDisplayCurrency()) + "\n" + i18n.M.CurrencyHint)
22 return nil
23 }
24 if len(args) > 2 {
25 m.notice(i18n.M.CurrencyHint)
26 return nil
27 }
28 mode, err := parseCLIPricingCurrency(args[1])
29 if err != nil {
30 m.notice(err.Error())
31 return nil
32 }
33 if !m.runtimeSettingChangeReady() {
34 return nil
35 }
36
37 path := config.UserConfigPath()
38 if path == "" {
39 m.notice("currency: cannot resolve user config path")
40 return nil
41 }
42 var resolved string
43 if err := func() error {
44 unlock := config.LockUserConfigEdits()
45 defer unlock()
46 edit := config.LoadForEdit(path)
47 if err := edit.SetDisplayCurrency(mode); err != nil {
48 return err
49 }
50 resolved = edit.ResolveDisplayCurrency()
51 return edit.SaveTo(path)
52 }(); err != nil {
53 m.notice("currency: " + err.Error())
54 return nil
55 }
56
57 success := fmt.Sprintf(i18n.M.CurrencyChangedFmt, pricingCurrencyDisplay(mode), resolved)
58 if m.ctrl == nil {
59 m.notice(success)
60 return nil
61 }
62 return m.scheduleCurrentControllerRebuild("currency", success)
63 }
64
65 func parseCLIPricingCurrency(value string) (string, error) {
66 switch strings.ToUpper(strings.TrimSpace(value)) {
67 case "", "AUTO":
68 return "", nil
69 case "CNY":
70 return "CNY", nil
71 case "USD":
72 return "USD", nil
73 default:
74 return "", fmt.Errorf("pricing currency %q: must be auto|CNY|USD", value)
75 }
76 }
77
78 func pricingCurrencyDisplay(currency string) string {
79 if strings.TrimSpace(currency) == "" {
80 return "auto"
81 }
82 return strings.ToUpper(strings.TrimSpace(currency))
83 }
84
85 func describePricingCurrencies(current, resolved string) string {
86 items := []string{"auto", "CNY", "USD"}
87 var b strings.Builder
88 for _, item := range items {
89 marker := " "
90 if item == current {
91 marker = "• "
92 }
93 hint := ""
94 if item == "auto" {
95 hint = " (" + resolved + ")"
96 }
97 fmt.Fprintf(&b, "%s%s%s\n", marker, item, hint)
98 }
99 return strings.TrimRight(b.String(), "\n")
100 }
101
101 lines GO