Skip to content

Commit de1d467

Browse files
author
Itay Donanhirsh
committed
support for cyclic next/prev
1 parent 2aa48e2 commit de1d467

3 files changed

Lines changed: 55 additions & 16 deletions

File tree

cmd/clutter/cmd_resolve.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55

66
cli "github.com/urfave/cli/v2"
7+
"go.uber.org/zap"
78

89
"github.com/cluttercode/clutter/internal/pkg/resolver"
910
"github.com/cluttercode/clutter/internal/pkg/scanner"
@@ -13,8 +14,8 @@ import (
1314

1415
var (
1516
resolveOpts = struct {
16-
content, loc string
17-
prev, next bool
17+
content, loc string
18+
prev, next, cyclic bool
1819
}{}
1920

2021
resolveCommand = cli.Command{
@@ -34,6 +35,12 @@ var (
3435
Usage: "show only the next match after the one specified",
3536
Destination: &resolveOpts.next,
3637
},
38+
&cli.BoolFlag{
39+
Name: "cyclic",
40+
Aliases: []string{"c"},
41+
Usage: "make --next and --prev cyclic",
42+
Destination: &resolveOpts.cyclic,
43+
},
3744
&cli.StringFlag{
3845
Name: "loc",
3946
Aliases: []string{"l"},
@@ -84,15 +91,17 @@ var (
8491

8592
z.Info("resolved tag")
8693

87-
r := resolver.ResolveList
94+
r := func(z *zap.SugaredLogger, what *clutterindex.Entry, index *clutterindex.Index, _ bool) ([]*clutterindex.Entry, error) {
95+
return resolver.ResolveList(z, what, index)
96+
}
8897

8998
if resolveOpts.next {
9099
r = resolver.ResolveNext
91100
} else if resolveOpts.prev {
92101
r = resolver.ResolvePrev
93102
}
94103

95-
ents, err := r(z, what, index)
104+
ents, err := r(z, what, index, resolveOpts.cyclic)
96105

97106
if err != nil {
98107
return fmt.Errorf("resolver: %w", err)

internal/pkg/resolver/resolver.go

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,30 @@ import (
88
"github.com/cluttercode/clutter/pkg/clutter/clutterindex"
99
)
1010

11+
type params struct{ next, prev, cycle, first, last bool }
12+
1113
func ResolveList(z *zap.SugaredLogger, what *clutterindex.Entry, index *clutterindex.Index) ([]*clutterindex.Entry, error) {
12-
return resolve(z, what, index, false, false)
14+
return resolve(z, what, index, params{})
1315
}
1416

15-
func ResolveNext(z *zap.SugaredLogger, what *clutterindex.Entry, index *clutterindex.Index) ([]*clutterindex.Entry, error) {
16-
return resolve(z, what, index, true, false)
17+
func ResolveNext(z *zap.SugaredLogger, what *clutterindex.Entry, index *clutterindex.Index, cycle bool) ([]*clutterindex.Entry, error) {
18+
return resolve(z, what, index, params{next: true, cycle: cycle})
1719
}
1820

19-
func ResolvePrev(z *zap.SugaredLogger, what *clutterindex.Entry, index *clutterindex.Index) ([]*clutterindex.Entry, error) {
20-
return resolve(z, what, index, false, true)
21+
func ResolvePrev(z *zap.SugaredLogger, what *clutterindex.Entry, index *clutterindex.Index, cycle bool) ([]*clutterindex.Entry, error) {
22+
return resolve(z, what, index, params{prev: true, cycle: cycle})
2123
}
2224

23-
func resolve(z *zap.SugaredLogger, what *clutterindex.Entry, index *clutterindex.Index, next, prev bool) ([]*clutterindex.Entry, error) {
24-
if next && prev {
25+
func resolve(z *zap.SugaredLogger, what *clutterindex.Entry, index *clutterindex.Index, p params) ([]*clutterindex.Entry, error) {
26+
if p.next && p.prev {
2527
z.Panic("prev and next are mutually exclusive")
2628
}
2729

2830
matcher := func(ent *clutterindex.Entry) bool { return what.Name == ent.Name && ent.IsReferredBy(what) }
2931

3032
if _, search := what.IsSearch(); search {
31-
if prev || next {
32-
prev, next = false, false
33+
if p.prev || p.next {
34+
p.prev, p.next = false, false
3335
z.Warn("--next and --prev are ignored when resolving a search tag")
3436
}
3537

@@ -56,7 +58,7 @@ func resolve(z *zap.SugaredLogger, what *clutterindex.Entry, index *clutterindex
5658
return nil
5759
}
5860

59-
if prev {
61+
if p.prev {
6062
if ent.Loc == what.Loc {
6163
if hold == nil {
6264
z.Debugw("found what, but nothing held")
@@ -65,7 +67,7 @@ func resolve(z *zap.SugaredLogger, what *clutterindex.Entry, index *clutterindex
6567

6668
z.Debugw("found what, emit held", "ent", hold)
6769

68-
fmt.Println(hold.String())
70+
ents = append(ents, hold)
6971

7072
return clutterindex.ErrStop
7173
}
@@ -76,7 +78,7 @@ func resolve(z *zap.SugaredLogger, what *clutterindex.Entry, index *clutterindex
7678
return nil
7779
}
7880

79-
if next {
81+
if p.next {
8082
if hold == nil {
8183
if ent.Loc == what.Loc {
8284
hold = ent
@@ -95,11 +97,27 @@ func resolve(z *zap.SugaredLogger, what *clutterindex.Entry, index *clutterindex
9597

9698
ents = append(ents, ent)
9799

100+
if p.first {
101+
return clutterindex.ErrStop
102+
}
103+
98104
return nil
99105
},
100106
); err != nil {
101107
return nil, fmt.Errorf("filter: %w", err)
102108
}
103109

110+
if p.cycle && len(ents) == 0 {
111+
if p.next {
112+
return resolve(z, what, index, params{first: true})
113+
} else if p.prev {
114+
return resolve(z, what, index, params{last: true})
115+
}
116+
}
117+
118+
if p.last && len(ents) > 0 {
119+
return []*clutterindex.Entry{ents[len(ents)-1]}, nil
120+
}
121+
104122
return ents, nil
105123
}

tests/cli/resolve.clitest

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,26 @@ z b:2.2-10
2626
z c:3.3-10
2727
$ ${CLUTTER} -i index.1 r --loc a:1.1 -n
2828
z b:2.2-10
29+
$ ${CLUTTER} -i index.1 r --loc a:1.1 -n -c
30+
z b:2.2-10
2931
$ ${CLUTTER} -i index.1 r --loc a:1.1 -p
32+
$ ${CLUTTER} -i index.1 r --loc a:1.1 -p -c
33+
z c:3.3-10
3034
$ ${CLUTTER} -i index.1 r --loc b:2.2 -p
3135
z a:1.1-10
36+
$ ${CLUTTER} -i index.1 r --loc b:2.2 -p -c
37+
z a:1.1-10
3238
$ ${CLUTTER} -i index.1 r --loc b:2.2 -n
3339
z c:3.3-10
40+
$ ${CLUTTER} -i index.1 r --loc b:2.2 -n -c
41+
z c:3.3-10
3442
$ ${CLUTTER} -i index.1 r --loc c:3.3 -p
3543
z b:2.2-10
44+
$ ${CLUTTER} -i index.1 r --loc c:3.3 -p -c
45+
z b:2.2-10
3646
$ ${CLUTTER} -i index.1 r --loc c:3.3 -n
47+
$ ${CLUTTER} -i index.1 r --loc c:3.3 -n -c
48+
z a:1.1-10
3749
$ ${CLUTTER} -i index.1 r --loc c:3.3 -n -p; echo $?
3850

3951
error: --prev and --next are mutually exclusive

0 commit comments

Comments
 (0)