Don't fail when calling Paginate with an empty pages.PagesGroup

Fixes #10802
This commit is contained in:
Bjørn Erik Pedersen 2023-03-08 09:28:46 +01:00
parent 0f01bd4637
commit 34a86e13f6
3 changed files with 35 additions and 9 deletions

View file

@ -136,3 +136,29 @@ weight: %d
b.Assert(b.CheckExists("public/page/1/index.json"), qt.Equals, false)
b.AssertFileContent("public/page/2/index.json", `JSON: 22: |/p11/index.json|/p12/index.json`)
}
// Issue 10802
func TestPaginatorEmptyPageGroups(t *testing.T) {
t.Parallel()
files := `
-- config.toml --
baseURL = "https://example.com/"
-- content/p1.md --
-- content/p2.md --
-- layouts/index.html --
{{ $empty := site.RegularPages | complement site.RegularPages }}
Len: {{ len $empty }}: Type: {{ printf "%T" $empty }}
{{ $pgs := $empty.GroupByPublishDate "January 2006" }}
{{ $pag := .Paginate $pgs }}
Len Pag: {{ len $pag.Pages }}
`
b := NewIntegrationTestBuilder(
IntegrationTestConfig{
T: t,
TxtarString: files,
},
).Build()
b.AssertFileContent("public/index.html", "Len: 0", "Len Pag: 0")
}

View file

@ -430,14 +430,14 @@ func (psg PagesGroup) ProbablyEq(other any) bool {
}
// ToPagesGroup tries to convert seq into a PagesGroup.
func ToPagesGroup(seq any) (PagesGroup, error) {
func ToPagesGroup(seq any) (PagesGroup, bool, error) {
switch v := seq.(type) {
case nil:
return nil, nil
return nil, true, nil
case PagesGroup:
return v, nil
return v, true, nil
case []PageGroup:
return PagesGroup(v), nil
return PagesGroup(v), true, nil
case []any:
l := len(v)
if l == 0 {
@ -450,12 +450,12 @@ func ToPagesGroup(seq any) (PagesGroup, error) {
if pg, ok := ipg.(PageGroup); ok {
pagesGroup[i] = pg
} else {
return nil, fmt.Errorf("unsupported type in paginate from slice, got %T instead of PageGroup", ipg)
return nil, false, fmt.Errorf("unsupported type in paginate from slice, got %T instead of PageGroup", ipg)
}
}
return pagesGroup, nil
return pagesGroup, true, nil
}
}
return nil, nil
return nil, false, nil
}

View file

@ -277,11 +277,11 @@ func Paginate(td TargetPathDescriptor, seq any, pagerSize int) (*Paginator, erro
var paginator *Paginator
groups, err := ToPagesGroup(seq)
groups, ok, err := ToPagesGroup(seq)
if err != nil {
return nil, err
}
if groups != nil {
if ok {
paginator, _ = newPaginatorFromPageGroups(groups, pagerSize, urlFactory)
} else {
pages, err := ToPages(seq)