Skip to content

Commit d4f61d4

Browse files
committed
refactor: fix cyclop, nestif lint
1 parent 7658cb7 commit d4f61d4

19 files changed

Lines changed: 808 additions & 669 deletions

.golangci.yaml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -121,16 +121,10 @@ linters:
121121
- whitespace # detects leading and trailing whitespace
122122

123123
disable:
124-
# TODO(xinnjie): Temporarily disable 'cyclop' due to many violations; fix and re-enable
125-
- cyclop
126124
# TODO(xinnjie): Temporarily disable 'exhaustive' due to many violations; fix and re-enable
127125
- exhaustive
128126
# TODO(xinnjie): Temporarily disable 'funlen' due to many violations; fix and re-enable
129127
- funlen
130-
# TODO(xinnjie): Temporarily disable 'gocyclo' due to many violations; fix and re-enable
131-
- gocyclo
132-
# TODO(xinnjie): Temporarily disable 'nestif' due to many violations; fix and re-enable
133-
- nestif
134128
# TODO(xinnjie): Temporarily disable 'nonamedreturns' due to many violations; fix and re-enable
135129
- nonamedreturns
136130
# TODO(xinnjie): Temporarily disable 'testpackage' due to many violations; fix and re-enable

internal/cmd/dev_list_unmapped_actions.go

Lines changed: 3 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ package cmd
33
import (
44
"log/slog"
55
"os"
6-
"slices"
76
"sort"
87

98
"github.com/spf13/cobra"
109
"github.com/xinnjie/onekeymap-cli/internal/mappings"
10+
"github.com/xinnjie/onekeymap-cli/pkg/pluginapi"
1111
)
1212

1313
type devListUnmappedActionsFlags struct {
@@ -39,87 +39,16 @@ func devListUnmappedActionsRun(
3939
return func(cmd *cobra.Command, _ []string) {
4040
logger := dependencies()
4141
ctx := cmd.Context()
42-
// Load all mappings
4342
mappingConfig, err := mappings.NewMappingConfig()
4443
if err != nil {
4544
logger.ErrorContext(ctx, "Error loading mapping config", "error", err)
4645
os.Exit(1)
4746
}
4847

48+
editorType := pluginapi.EditorType(f.editor)
4949
unmapped := make([]string, 0)
5050
for id, m := range mappingConfig.Mappings {
51-
mapped := false
52-
// Skip entries explicitly marked as notSupported for the selected editor
53-
switch f.editor {
54-
case "vscode":
55-
skip := false
56-
for _, vc := range m.VSCode {
57-
if vc.NotSupported {
58-
skip = true
59-
break
60-
}
61-
}
62-
if skip {
63-
continue
64-
}
65-
case "intellij":
66-
if m.IntelliJ.NotSupported {
67-
continue
68-
}
69-
case "zed":
70-
skip := slices.ContainsFunc(m.Zed, func(zc mappings.ZedMappingConfig) bool {
71-
return zc.NotSupported
72-
})
73-
if skip {
74-
continue
75-
}
76-
case "vim":
77-
if m.Vim.NotSupported {
78-
continue
79-
}
80-
case "helix":
81-
skip := slices.ContainsFunc(m.Helix, func(hc mappings.HelixMappingConfig) bool {
82-
return hc.NotSupported
83-
})
84-
if skip {
85-
continue
86-
}
87-
default:
88-
logger.WarnContext(ctx, "Unknown editor", "editor", f.editor)
89-
}
90-
91-
switch f.editor {
92-
case "vscode":
93-
for _, vc := range m.VSCode {
94-
if vc.Command != "" {
95-
mapped = true
96-
break
97-
}
98-
}
99-
case "intellij":
100-
if m.IntelliJ.Action != "" {
101-
mapped = true
102-
}
103-
case "zed":
104-
for _, zc := range m.Zed {
105-
if zc.Action != "" {
106-
mapped = true
107-
break
108-
}
109-
}
110-
case "vim":
111-
if m.Vim.Command != "" {
112-
mapped = true
113-
}
114-
case "helix":
115-
for _, hc := range m.Helix {
116-
if hc.Command != "" {
117-
mapped = true
118-
break
119-
}
120-
}
121-
}
122-
if !mapped {
51+
if !m.IsSupported(editorType) {
12352
unmapped = append(unmapped, id)
12453
}
12554
}

internal/cmd/export.go

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,38 @@ func exportRun(
166166
}
167167
}
168168

169+
func handleInteractiveExportFlags(
170+
cmd *cobra.Command,
171+
f *exportFlags,
172+
onekeymapPlaceholder string,
173+
pluginRegistry *plugins.Registry,
174+
) error {
175+
needSelectEditor := !cmd.Flags().Changed("to") || f.to == ""
176+
needInput := !cmd.Flags().Changed("input") || f.input == ""
177+
needOutput := !cmd.Flags().Changed("output") || f.output == ""
178+
179+
if needSelectEditor || needInput || needOutput {
180+
if err := runExportForm(pluginRegistry, &f.to, &f.input, &f.output, onekeymapPlaceholder, needSelectEditor, needInput, needOutput); err != nil {
181+
return err
182+
}
183+
}
184+
return nil
185+
}
186+
187+
func handleNonInteractiveExportFlags(
188+
cmd *cobra.Command,
189+
f *exportFlags,
190+
onekeymapPlaceholder string,
191+
) error {
192+
if f.to == "" {
193+
return errors.New("flag --to is required")
194+
}
195+
if !cmd.Flags().Changed("input") && onekeymapPlaceholder != "" {
196+
f.input = onekeymapPlaceholder
197+
}
198+
return nil
199+
}
200+
169201
func prepareExportInputFlags(
170202
cmd *cobra.Command,
171203
f *exportFlags,
@@ -174,21 +206,12 @@ func prepareExportInputFlags(
174206
logger *slog.Logger,
175207
) error {
176208
if f.interactive {
177-
needSelectEditor := !cmd.Flags().Changed("to") || f.to == ""
178-
needInput := !cmd.Flags().Changed("input") || f.input == ""
179-
needOutput := !cmd.Flags().Changed("output") || f.output == ""
180-
181-
if needSelectEditor || needInput || needOutput {
182-
if err := runExportForm(pluginRegistry, &f.to, &f.input, &f.output, onekeymapPlaceholder, needSelectEditor, needInput, needOutput); err != nil {
183-
return err
184-
}
209+
if err := handleInteractiveExportFlags(cmd, f, onekeymapPlaceholder, pluginRegistry); err != nil {
210+
return err
185211
}
186212
} else {
187-
if f.to == "" {
188-
return errors.New("flag --to is required")
189-
}
190-
if !cmd.Flags().Changed("input") && onekeymapPlaceholder != "" {
191-
f.input = onekeymapPlaceholder
213+
if err := handleNonInteractiveExportFlags(cmd, f, onekeymapPlaceholder); err != nil {
214+
return err
192215
}
193216
}
194217

internal/cmd/import.go

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,37 @@ func importRun(
163163
}
164164
}
165165

166+
func handleInteractiveImportFlags(
167+
cmd *cobra.Command,
168+
f *importFlags,
169+
onekeymapConfig string,
170+
pluginRegistry *plugins.Registry,
171+
) error {
172+
needSelectEditor := !cmd.Flags().Changed("from") || f.from == ""
173+
needInput := !cmd.Flags().Changed("input") || f.input == ""
174+
needOutput := !cmd.Flags().Changed("output") || f.output == ""
175+
176+
if needSelectEditor || needInput || needOutput {
177+
if err := runImportForm(pluginRegistry, &f.from, &f.input, &f.output, onekeymapConfig, needSelectEditor, needInput, needOutput); err != nil {
178+
return err
179+
}
180+
}
181+
return nil
182+
}
183+
184+
func handleNonInteractiveImportFlags(
185+
f *importFlags,
186+
onekeymapConfig string,
187+
) error {
188+
if f.from == "" {
189+
return errors.New("flag --from is required")
190+
}
191+
if onekeymapConfig != "" {
192+
f.output = onekeymapConfig
193+
}
194+
return nil
195+
}
196+
166197
func prepareImportInputFlags(
167198
cmd *cobra.Command,
168199
f *importFlags,
@@ -171,21 +202,12 @@ func prepareImportInputFlags(
171202
logger *slog.Logger,
172203
) error {
173204
if f.interactive {
174-
needSelectEditor := !cmd.Flags().Changed("from") || f.from == ""
175-
needInput := !cmd.Flags().Changed("input") || f.input == ""
176-
needOutput := !cmd.Flags().Changed("output") || f.output == ""
177-
178-
if needSelectEditor || needInput || needOutput {
179-
if err := runImportForm(pluginRegistry, &f.from, &f.input, &f.output, onekeymapConfig, needSelectEditor, needInput, needOutput); err != nil {
180-
return err
181-
}
205+
if err := handleInteractiveImportFlags(cmd, f, onekeymapConfig, pluginRegistry); err != nil {
206+
return err
182207
}
183208
} else {
184-
if f.from == "" {
185-
return errors.New("flag --from is required")
186-
}
187-
if onekeymapConfig != "" {
188-
f.output = onekeymapConfig
209+
if err := handleNonInteractiveImportFlags(f, onekeymapConfig); err != nil {
210+
return err
189211
}
190212
}
191213

internal/cmd/serve.go

Lines changed: 62 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cmd
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67
"log/slog"
78
"net"
@@ -70,49 +71,14 @@ func serveRun(
7071
socketPath string
7172
)
7273

73-
if strings.HasPrefix(addr, "unix://") || strings.HasPrefix(addr, "unix:") {
74-
// Unix domain socket
75-
socketPath = addr
76-
if strings.HasPrefix(socketPath, "unix://") {
77-
socketPath = strings.TrimPrefix(socketPath, "unix://")
78-
} else {
79-
socketPath = strings.TrimPrefix(socketPath, "unix:")
80-
}
81-
// Remove stale file if exists
82-
if _, statErr := os.Stat(socketPath); statErr == nil {
83-
_ = os.Remove(socketPath)
84-
}
85-
lc := net.ListenConfig{}
86-
lis, err = lc.Listen(ctx, "unix", socketPath)
87-
if err != nil {
88-
logger.ErrorContext(ctx, "failed to listen on unix socket", "path", socketPath, "err", err)
89-
os.Exit(1)
90-
}
91-
// Best-effort restrict permissions
92-
_ = os.Chmod(socketPath, 0o600)
93-
// Ensure cleanup on exit
74+
lis, socketPath, err = setupListener(ctx, addr, logger)
75+
if err != nil {
76+
os.Exit(1)
77+
}
78+
if socketPath != "" {
9479
defer func() {
9580
_ = os.Remove(socketPath)
9681
}()
97-
logger.InfoContext(ctx, "server listening", "address", "unix://"+socketPath)
98-
} else {
99-
// TCP (allow optional tcp:// prefix)
100-
if after, ok := strings.CutPrefix(addr, "tcp://"); ok {
101-
addr = after
102-
}
103-
104-
if addr == "" {
105-
logger.ErrorContext(ctx, "empty listen address")
106-
os.Exit(1)
107-
}
108-
109-
lc := net.ListenConfig{}
110-
lis, err = lc.Listen(ctx, "tcp", addr)
111-
if err != nil {
112-
logger.ErrorContext(ctx, "failed to listen on tcp", "address", addr, "err", err)
113-
os.Exit(1)
114-
}
115-
logger.InfoContext(ctx, "server listening", "address", "tcp://"+lis.Addr().String())
11682
}
11783

11884
logEvents := func() []grpc_logging.LoggableEvent {
@@ -169,6 +135,62 @@ func serveRun(
169135
}
170136
}
171137

138+
func setupListener(ctx context.Context, addr string, logger *slog.Logger) (net.Listener, string, error) {
139+
if strings.HasPrefix(addr, "unix://") || strings.HasPrefix(addr, "unix:") {
140+
return setupUnixSocketListener(ctx, addr, logger)
141+
}
142+
return setupTCPListener(ctx, addr, logger)
143+
}
144+
145+
func setupUnixSocketListener(ctx context.Context, addr string, logger *slog.Logger) (net.Listener, string, error) {
146+
socketPath := addr
147+
if strings.HasPrefix(socketPath, "unix://") {
148+
socketPath = strings.TrimPrefix(socketPath, "unix://")
149+
} else {
150+
socketPath = strings.TrimPrefix(socketPath, "unix:")
151+
}
152+
153+
// Remove stale file if exists
154+
if _, statErr := os.Stat(socketPath); statErr == nil {
155+
_ = os.Remove(socketPath)
156+
}
157+
158+
lc := net.ListenConfig{}
159+
lis, err := lc.Listen(ctx, "unix", socketPath)
160+
if err != nil {
161+
logger.ErrorContext(ctx, "failed to listen on unix socket", "path", socketPath, "err", err)
162+
return nil, "", err
163+
}
164+
165+
// Best-effort restrict permissions
166+
_ = os.Chmod(socketPath, 0o600)
167+
logger.InfoContext(ctx, "server listening", "address", "unix://"+socketPath)
168+
169+
return lis, socketPath, nil
170+
}
171+
172+
func setupTCPListener(ctx context.Context, addr string, logger *slog.Logger) (net.Listener, string, error) {
173+
// TCP (allow optional tcp:// prefix)
174+
if after, ok := strings.CutPrefix(addr, "tcp://"); ok {
175+
addr = after
176+
}
177+
178+
if addr == "" {
179+
logger.ErrorContext(ctx, "empty listen address")
180+
return nil, "", errors.New("empty listen address")
181+
}
182+
183+
lc := net.ListenConfig{}
184+
lis, err := lc.Listen(ctx, "tcp", addr)
185+
if err != nil {
186+
logger.ErrorContext(ctx, "failed to listen on tcp", "address", addr, "err", err)
187+
return nil, "", err
188+
}
189+
logger.InfoContext(ctx, "server listening", "address", "tcp://"+lis.Addr().String())
190+
191+
return lis, "", nil
192+
}
193+
172194
// grpcLogger adapts slog to grpc_logging.Logger.
173195
func grpcLogger(l *slog.Logger) grpc_logging.Logger {
174196
return grpc_logging.LoggerFunc(func(_ context.Context, lvl grpc_logging.Level, msg string, fields ...any) {

0 commit comments

Comments
 (0)