Skip to content

Commit c53c576

Browse files
committed
internal/mcp/internal/util: add Wrapf
Add Wrapf, a function that helps with error wrapping. Change-Id: I102695f75e4d217e09f828f4723cbfcbbe83f887 Reviewed-on: https://go-review.googlesource.com/c/tools/+/679177 Reviewed-by: Robert Findley <rfindley@google.com> Reviewed-by: Sam Thanawalla <samthanawalla@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
1 parent 0d2de46 commit c53c576

File tree

6 files changed

+17
-20
lines changed

6 files changed

+17
-20
lines changed

internal/mcp/internal/util/util.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package util
66

77
import (
88
"cmp"
9+
"fmt"
910
"iter"
1011
"reflect"
1112
"slices"
@@ -73,3 +74,10 @@ func FieldJSONInfo(f reflect.StructField) JSONInfo {
7374
}
7475
return info
7576
}
77+
78+
// Wrapf wraps *errp with the given formatted message if *errp is not nil.
79+
func Wrapf(errp *error, format string, args ...any) {
80+
if *errp != nil {
81+
*errp = fmt.Errorf("%s: %w", fmt.Sprintf(format, args...), *errp)
82+
}
83+
}

internal/mcp/jsonschema/json_pointer.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import (
2626
"reflect"
2727
"strconv"
2828
"strings"
29+
30+
"golang.org/x/tools/internal/mcp/internal/util"
2931
)
3032

3133
var (
@@ -69,7 +71,7 @@ func parseJSONPointer(ptr string) (segments []string, err error) {
6971
// This implementation suffices for JSON Schema: pointers are applied only to Schemas,
7072
// and refer only to Schemas.
7173
func dereferenceJSONPointer(s *Schema, sptr string) (_ *Schema, err error) {
72-
defer wrapf(&err, "JSON Pointer %q", sptr)
74+
defer util.Wrapf(&err, "JSON Pointer %q", sptr)
7375

7476
segments, err := parseJSONPointer(sptr)
7577
if err != nil {

internal/mcp/jsonschema/util.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -282,10 +282,3 @@ func assert(cond bool, msg string) {
282282
panic("assertion failed: " + msg)
283283
}
284284
}
285-
286-
// wrapf wraps *errp with the given formatted message if *errp is not nil.
287-
func wrapf(errp *error, format string, args ...any) {
288-
if *errp != nil {
289-
*errp = fmt.Errorf("%s: %w", fmt.Sprintf(format, args...), *errp)
290-
}
291-
}

internal/mcp/jsonschema/validate.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ type state struct {
7373

7474
// validate validates the reflected value of the instance.
7575
func (st *state) validate(instance reflect.Value, schema *Schema, callerAnns *annotations) (err error) {
76-
defer wrapf(&err, "validating %s", schema)
76+
defer util.Wrapf(&err, "validating %s", schema)
7777

7878
// Maintain a stack for dynamic schema resolution.
7979
st.stack = append(st.stack, schema) // push
@@ -607,7 +607,7 @@ func (rs *Resolved) ApplyDefaults(instancep any) error {
607607
// Leave this as a potentially recursive helper function, because we'll surely want
608608
// to apply defaults on sub-schemas someday.
609609
func (st *state) applyDefaults(instancep reflect.Value, schema *Schema) (err error) {
610-
defer wrapf(&err, "applyDefaults: schema %s, instance %v", schema, instancep)
610+
defer util.Wrapf(&err, "applyDefaults: schema %s, instance %v", schema, instancep)
611611

612612
instance := instancep.Elem()
613613
if instance.Kind() == reflect.Map || instance.Kind() == reflect.Struct {

internal/mcp/resource.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"strings"
1717

1818
jsonrpc2 "golang.org/x/tools/internal/jsonrpc2_v2"
19+
"golang.org/x/tools/internal/mcp/internal/util"
1920
)
2021

2122
// A ServerResource associates a Resource with its handler.
@@ -122,11 +123,7 @@ func fileRoots(rawRoots []*Root) ([]string, error) {
122123

123124
// fileRoot returns the absolute path for Root.
124125
func fileRoot(root *Root) (_ string, err error) {
125-
defer func() {
126-
if err != nil {
127-
err = fmt.Errorf("root %q: %w", root.URI, err)
128-
}
129-
}()
126+
defer util.Wrapf(&err, "root %q", root.URI)
130127

131128
// Convert to absolute file path.
132129
rurl, err := url.Parse(root.URI)

internal/mcp/server.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"sync"
1919

2020
jsonrpc2 "golang.org/x/tools/internal/jsonrpc2_v2"
21+
"golang.org/x/tools/internal/mcp/internal/util"
2122
)
2223

2324
const DefaultPageSize = 1000
@@ -296,11 +297,7 @@ func fileResourceHandler(dir string) ResourceHandler {
296297
panic(err)
297298
}
298299
return func(ctx context.Context, ss *ServerSession, params *ReadResourceParams) (_ *ReadResourceResult, err error) {
299-
defer func() {
300-
if err != nil {
301-
err = fmt.Errorf("reading resource %s: %w", params.URI, err)
302-
}
303-
}()
300+
defer util.Wrapf(&err, "reading resource %s", params.URI)
304301

305302
// TODO: use a memoizing API here.
306303
rootRes, err := ss.ListRoots(ctx, nil)

0 commit comments

Comments
 (0)