Skip to content

Commit 33ff67a

Browse files
refactor: riorganizzazione SOLID del codice UI e infrastructure
Applicato principio Single Responsibility separando main_window.go (962 righe) in moduli distinti: tree_view.go per navigazione, detail_panel.go per visualizzazione dettagli, server_dialogs.go per dialog di gestione server. Estratto server_parser.go da claude_config.go per isolare la logica di parsing JSON. Tutti i file ora rispettano il limite di 300 righe.
1 parent c3677b6 commit 33ff67a

File tree

7 files changed

+975
-931
lines changed

7 files changed

+975
-931
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ e questo progetto aderisce al [Semantic Versioning](https://semver.org/lang/it/)
2121

2222
- Refactoring Clean Architecture: parsing JSON server spostato nel layer Application
2323
- Rimosso dead code e corretto uso API deprecate (Clipboard)
24+
- Refactoring SOLID: main_window.go (962→156 righe) suddiviso in tree_view.go, detail_panel.go, server_dialogs.go
25+
- Refactoring SOLID: claude_config.go (326→216 righe) con estrazione server_parser.go
2426

2527
## [0.0.3] - 2025-12-30
2628

internal/infrastructure/claude_config.go

Lines changed: 2 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ func (r *ClaudeConfigRepository) Save(config *domain.Configuration) error {
114114
// Aggiorna mcpServers globali
115115
mcpServers := make(map[string]interface{})
116116
for name, server := range config.GlobalServers {
117-
mcpServers[name] = serverToMap(server)
117+
mcpServers[name] = ServerToMap(server)
118118
}
119119
r.rawConfig["mcpServers"] = mcpServers
120120

@@ -140,7 +140,7 @@ func (r *ClaudeConfigRepository) Save(config *domain.Configuration) error {
140140
// Aggiorna mcpServers del progetto
141141
projectServers := make(map[string]interface{})
142142
for name, server := range project.MCPServers {
143-
projectServers[name] = serverToMap(server)
143+
projectServers[name] = ServerToMap(server)
144144
}
145145
projectData["mcpServers"] = projectServers
146146

@@ -209,118 +209,8 @@ func (r *ClaudeConfigRepository) cleanOldBackups() {
209209
}
210210
}
211211

212-
// ParseServer converte un map[string]interface{} in MCPServer
213-
func ParseServer(data interface{}) (domain.MCPServer, error) {
214-
serverMap, ok := data.(map[string]interface{})
215-
if !ok {
216-
return domain.MCPServer{}, fmt.Errorf("formato server non valido")
217-
}
218-
219-
server := domain.MCPServer{}
220-
221-
if t, ok := serverMap["type"].(string); ok {
222-
server.Type = domain.ServerType(t)
223-
}
224-
if cmd, ok := serverMap["command"].(string); ok {
225-
server.Command = cmd
226-
}
227-
if url, ok := serverMap["url"].(string); ok {
228-
server.URL = url
229-
}
230-
if timeout, ok := serverMap["timeout"].(float64); ok {
231-
server.Timeout = int(timeout)
232-
}
233-
234-
if args, ok := serverMap["args"].([]interface{}); ok {
235-
server.Args = make([]string, 0, len(args))
236-
for _, arg := range args {
237-
if s, ok := arg.(string); ok {
238-
server.Args = append(server.Args, s)
239-
}
240-
}
241-
}
242-
243-
if headers, ok := serverMap["headers"].(map[string]interface{}); ok {
244-
server.Headers = make(map[string]string)
245-
for k, v := range headers {
246-
if s, ok := v.(string); ok {
247-
server.Headers[k] = s
248-
}
249-
}
250-
}
251-
252-
if env, ok := serverMap["env"].(map[string]interface{}); ok {
253-
server.Env = make(map[string]string)
254-
for k, v := range env {
255-
if s, ok := v.(string); ok {
256-
server.Env[k] = s
257-
}
258-
}
259-
}
260-
261-
return server, nil
262-
}
263-
264-
// serverToMap converte MCPServer in map[string]interface{}
265-
func serverToMap(server domain.MCPServer) map[string]interface{} {
266-
result := make(map[string]interface{})
267-
268-
if server.Type != "" {
269-
result["type"] = string(server.Type)
270-
}
271-
if server.Command != "" {
272-
result["command"] = server.Command
273-
}
274-
if server.URL != "" {
275-
result["url"] = server.URL
276-
}
277-
if server.Timeout > 0 {
278-
result["timeout"] = server.Timeout
279-
}
280-
if len(server.Args) > 0 {
281-
result["args"] = server.Args
282-
}
283-
if len(server.Headers) > 0 {
284-
result["headers"] = server.Headers
285-
}
286-
if len(server.Env) > 0 {
287-
result["env"] = server.Env
288-
}
289-
290-
return result
291-
}
292-
293212
// fileExists verifica se un file esiste
294213
func fileExists(path string) bool {
295214
_, err := os.Stat(path)
296215
return err == nil
297216
}
298-
299-
// LoadMCPFileServers carica i server da un file .mcp.json o .mcp.local.json
300-
func LoadMCPFileServers(path string) map[string]domain.MCPServer {
301-
result := make(map[string]domain.MCPServer)
302-
303-
data, err := os.ReadFile(path)
304-
if err != nil {
305-
return result
306-
}
307-
308-
var raw struct {
309-
MCPServers map[string]interface{} `json:"mcpServers"`
310-
}
311-
312-
if err := json.Unmarshal(data, &raw); err != nil {
313-
return result
314-
}
315-
316-
for name, serverData := range raw.MCPServers {
317-
server, err := ParseServer(serverData)
318-
if err != nil {
319-
continue
320-
}
321-
server.Name = name
322-
result[name] = server
323-
}
324-
325-
return result
326-
}
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package infrastructure
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"os"
7+
8+
"github.com/strawberry-code/mcp-curator/internal/domain"
9+
)
10+
11+
// ParseServer converte un map[string]interface{} in MCPServer
12+
func ParseServer(data interface{}) (domain.MCPServer, error) {
13+
serverMap, ok := data.(map[string]interface{})
14+
if !ok {
15+
return domain.MCPServer{}, fmt.Errorf("formato server non valido")
16+
}
17+
18+
server := domain.MCPServer{}
19+
20+
if t, ok := serverMap["type"].(string); ok {
21+
server.Type = domain.ServerType(t)
22+
}
23+
if cmd, ok := serverMap["command"].(string); ok {
24+
server.Command = cmd
25+
}
26+
if url, ok := serverMap["url"].(string); ok {
27+
server.URL = url
28+
}
29+
if timeout, ok := serverMap["timeout"].(float64); ok {
30+
server.Timeout = int(timeout)
31+
}
32+
33+
if args, ok := serverMap["args"].([]interface{}); ok {
34+
server.Args = make([]string, 0, len(args))
35+
for _, arg := range args {
36+
if s, ok := arg.(string); ok {
37+
server.Args = append(server.Args, s)
38+
}
39+
}
40+
}
41+
42+
if headers, ok := serverMap["headers"].(map[string]interface{}); ok {
43+
server.Headers = make(map[string]string)
44+
for k, v := range headers {
45+
if s, ok := v.(string); ok {
46+
server.Headers[k] = s
47+
}
48+
}
49+
}
50+
51+
if env, ok := serverMap["env"].(map[string]interface{}); ok {
52+
server.Env = make(map[string]string)
53+
for k, v := range env {
54+
if s, ok := v.(string); ok {
55+
server.Env[k] = s
56+
}
57+
}
58+
}
59+
60+
return server, nil
61+
}
62+
63+
// ServerToMap converte MCPServer in map[string]interface{}
64+
func ServerToMap(server domain.MCPServer) map[string]interface{} {
65+
result := make(map[string]interface{})
66+
67+
if server.Type != "" {
68+
result["type"] = string(server.Type)
69+
}
70+
if server.Command != "" {
71+
result["command"] = server.Command
72+
}
73+
if server.URL != "" {
74+
result["url"] = server.URL
75+
}
76+
if server.Timeout > 0 {
77+
result["timeout"] = server.Timeout
78+
}
79+
if len(server.Args) > 0 {
80+
result["args"] = server.Args
81+
}
82+
if len(server.Headers) > 0 {
83+
result["headers"] = server.Headers
84+
}
85+
if len(server.Env) > 0 {
86+
result["env"] = server.Env
87+
}
88+
89+
return result
90+
}
91+
92+
// LoadMCPFileServers carica i server da un file .mcp.json o .mcp.local.json
93+
func LoadMCPFileServers(path string) map[string]domain.MCPServer {
94+
result := make(map[string]domain.MCPServer)
95+
96+
data, err := os.ReadFile(path)
97+
if err != nil {
98+
return result
99+
}
100+
101+
var raw struct {
102+
MCPServers map[string]interface{} `json:"mcpServers"`
103+
}
104+
105+
if err := json.Unmarshal(data, &raw); err != nil {
106+
return result
107+
}
108+
109+
for name, serverData := range raw.MCPServers {
110+
server, err := ParseServer(serverData)
111+
if err != nil {
112+
continue
113+
}
114+
server.Name = name
115+
result[name] = server
116+
}
117+
118+
return result
119+
}

0 commit comments

Comments
 (0)