From 042e886b2f211f628d65b268bee68d70f995d2a6 Mon Sep 17 00:00:00 2001 From: Virgil Date: Wed, 1 Apr 2026 07:01:59 +0000 Subject: [PATCH] feat: add wiki iter pages Co-Authored-By: Virgil --- wiki.go | 17 +++++++++++++++++ wiki_test.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/wiki.go b/wiki.go index 5a5e039..ce9ce3a 100644 --- a/wiki.go +++ b/wiki.go @@ -2,6 +2,7 @@ package forge import ( "context" + "iter" "dappco.re/go/core/forge/types" ) @@ -31,6 +32,22 @@ func (s *WikiService) ListPages(ctx context.Context, owner, repo string) ([]type return out, nil } +// IterPages returns an iterator over all wiki page metadata for a repository. +func (s *WikiService) IterPages(ctx context.Context, owner, repo string) iter.Seq2[types.WikiPageMetaData, error] { + return func(yield func(types.WikiPageMetaData, error) bool) { + items, err := s.ListPages(ctx, owner, repo) + if err != nil { + yield(*new(types.WikiPageMetaData), err) + return + } + for _, item := range items { + if !yield(item, nil) { + return + } + } + } +} + // GetPage returns a single wiki page by name. func (s *WikiService) GetPage(ctx context.Context, owner, repo, pageName string) (*types.WikiPage, error) { path := ResolvePath("/api/v1/repos/{owner}/{repo}/wiki/page/{pageName}", pathParams("owner", owner, "repo", repo, "pageName", pageName)) diff --git a/wiki_test.go b/wiki_test.go index 2a35728..2de0e29 100644 --- a/wiki_test.go +++ b/wiki_test.go @@ -41,6 +41,37 @@ func TestWikiService_ListPages_Good(t *testing.T) { } } +func TestWikiService_IterPages_Good(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + t.Errorf("expected GET, got %s", r.Method) + } + if r.URL.Path != "/api/v1/repos/core/go-forge/wiki/pages" { + t.Errorf("wrong path: %s", r.URL.Path) + } + json.NewEncoder(w).Encode([]types.WikiPageMetaData{ + {Title: "Home", SubURL: "Home"}, + {Title: "Setup", SubURL: "Setup"}, + }) + })) + defer srv.Close() + + f := NewForge(srv.URL, "tok") + var titles []string + for page, err := range f.Wiki.IterPages(context.Background(), "core", "go-forge") { + if err != nil { + t.Fatal(err) + } + titles = append(titles, page.Title) + } + if len(titles) != 2 { + t.Fatalf("got %d pages, want 2", len(titles)) + } + if titles[0] != "Home" || titles[1] != "Setup" { + t.Fatalf("unexpected titles: %+v", titles) + } +} + func TestWikiService_GetPage_Good(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet {