@@ -3,8 +3,11 @@ package mcp
33import (
44 "context"
55 "fmt"
6+ "strings"
7+ "encoding/json"
68
79 "go.datum.net/datumctl/internal/client"
10+ syaml "sigs.k8s.io/yaml"
811)
912
1013type Service struct {
@@ -69,11 +72,43 @@ func (s *Service) GetCRD(ctx context.Context, r GetCRDReq) (GetCRDResp, error) {
6972 if r .Name == "" {
7073 return GetCRDResp {}, fmt .Errorf ("missing CRD name" )
7174 }
72- text , err := s .K .GetCRD (ctx , r .Name , r . Mode )
75+ crd , err := s .K .GetCRD (ctx , r .Name ) // native CRD from client
7376 if err != nil {
7477 return GetCRDResp {}, err
7578 }
76- return GetCRDResp {Text : text }, nil
79+
80+ switch strings .ToLower (r .Mode ) {
81+ case "json" :
82+ b , err := json .MarshalIndent (crd , "" , " " )
83+ if err != nil {
84+ return GetCRDResp {}, err
85+ }
86+ return GetCRDResp {Text : string (b )}, nil
87+
88+ case "describe" :
89+ var sb strings.Builder
90+ fmt .Fprintf (& sb , "Name: %s\n " , crd .Name )
91+ fmt .Fprintf (& sb , "Group: %s\n " , crd .Spec .Group )
92+ fmt .Fprintf (& sb , "Kind: %s\n " , crd .Spec .Names .Kind )
93+ fmt .Fprintf (& sb , "Scope: %s\n " , crd .Spec .Scope )
94+ versions := make ([]string , 0 , len (crd .Spec .Versions ))
95+ for _ , v := range crd .Spec .Versions {
96+ versions = append (versions , v .Name )
97+ }
98+ fmt .Fprintf (& sb , "Versions: %s\n " , strings .Join (versions , ", " ))
99+ return GetCRDResp {Text : sb .String ()}, nil
100+
101+ default : // yaml
102+ b , err := json .Marshal (crd )
103+ if err != nil {
104+ return GetCRDResp {}, err
105+ }
106+ y , err := syaml .JSONToYAML (b )
107+ if err != nil {
108+ return GetCRDResp {}, err
109+ }
110+ return GetCRDResp {Text : string (y )}, nil
111+ }
77112}
78113
79114func (s * Service ) ValidateYAML (ctx context.Context , r ValidateReq ) ValidateResp {
0 commit comments