feat(forge): add safe resource stringers
Some checks failed
Security Scan / security (push) Successful in 12s
Test / test (push) Has been cancelled

Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
Virgil 2026-04-02 07:52:00 +00:00
parent 40934c2e43
commit 7e8340a3d4
2 changed files with 44 additions and 0 deletions

View file

@ -3,6 +3,7 @@ package forge
import (
"context"
"iter"
"strconv"
core "dappco.re/go/core"
)
@ -20,6 +21,28 @@ type Resource[T any, C any, U any] struct {
collection string // collection path: /api/v1/repos/{owner}/{repo}/issues
}
// String returns a safe summary of the resource configuration.
//
// Usage:
//
// s := res.String()
func (r *Resource[T, C, U]) String() string {
return core.Concat(
"forge.Resource{path=",
strconv.Quote(r.path),
", collection=",
strconv.Quote(r.collection),
"}",
)
}
// GoString returns a safe Go-syntax summary of the resource configuration.
//
// Usage:
//
// s := fmt.Sprintf("%#v", res)
func (r *Resource[T, C, U]) GoString() string { return r.String() }
// NewResource creates a new Resource for the given path pattern.
// The path should be the item path (e.g., /repos/{owner}/{repo}/issues/{index}).
// The collection path is derived by stripping the last /{placeholder} segment.

21
resource_string_test.go Normal file
View file

@ -0,0 +1,21 @@
package forge
import (
"fmt"
"testing"
)
func TestResource_String_Good(t *testing.T) {
res := NewResource[int, struct{}, struct{}](NewClient("https://forge.lthn.ai", "tok"), "/api/v1/repos/{owner}/{repo}")
got := fmt.Sprint(res)
want := `forge.Resource{path="/api/v1/repos/{owner}/{repo}", collection="/api/v1/repos/{owner}"}`
if got != want {
t.Fatalf("got %q, want %q", got, want)
}
if got := res.String(); got != want {
t.Fatalf("got String()=%q, want %q", got, want)
}
if got := fmt.Sprintf("%#v", res); got != want {
t.Fatalf("got GoString=%q, want %q", got, want)
}
}