Skip to content

Commit 321f94e

Browse files
authored
Merge pull request #334 from a2xdeveloper/feature/tag-filter
Filter snippets by tag -> pet list -t $tag #329
2 parents 19068f8 + 4e0e0c1 commit 321f94e

File tree

3 files changed

+62
-0
lines changed

3 files changed

+62
-0
lines changed

cmd/list.go

+5
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ func list(cmd *cobra.Command, args []string) error {
2929
return err
3030
}
3131

32+
if config.Flag.FilterTag != "" {
33+
snippets.Snippets = snippets.FilterByTags(strings.Split(config.Flag.FilterTag, ","))
34+
}
35+
3236
col := config.Conf.General.Column
3337
if col == 0 {
3438
col = column
@@ -82,4 +86,5 @@ func init() {
8286
RootCmd.AddCommand(listCmd)
8387
listCmd.Flags().BoolVarP(&config.Flag.OneLine, "oneline", "", false,
8488
`Display snippets in one line`)
89+
listCmd.Flags().StringVar(&config.Flag.FilterTag, "t", "", "list by specified tags as comma separated values")
8590
}

snippet/snippet.go

+19
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"bytes"
55
"fmt"
66
"os"
7+
"slices"
78
"sort"
89

910
"github.com/knqyf263/pet/config"
@@ -164,6 +165,24 @@ func (snippets *Snippets) Order() {
164165
}
165166
}
166167

168+
// FilterByTags filters snippets by tags.
169+
func (snippets *Snippets) FilterByTags(tags []string) (filteredSnippets []SnippetInfo) {
170+
for _, snippet := range snippets.Snippets {
171+
if len(snippet.Tag) == 0 {
172+
continue
173+
}
174+
175+
for _, tag := range tags {
176+
if slices.Contains(snippet.Tag, tag) {
177+
filteredSnippets = append(filteredSnippets, snippet)
178+
break
179+
}
180+
}
181+
}
182+
183+
return filteredSnippets
184+
}
185+
167186
func (snippets *Snippets) reverse() {
168187
for i, j := 0, len(snippets.Snippets)-1; i < j; i, j = i+1, j-1 {
169188
snippets.Snippets[i], snippets.Snippets[j] = snippets.Snippets[j], snippets.Snippets[i]

snippet/snippet_test.go

+38
Original file line numberDiff line numberDiff line change
@@ -303,3 +303,41 @@ func TestSaveWithMultipleSnippetFiles(t *testing.T) {
303303
`
304304
assert.Equal(t, want, string(data))
305305
}
306+
307+
func TestFilterByTags(t *testing.T) {
308+
snippets := &Snippets{
309+
Snippets: []SnippetInfo{
310+
{
311+
Description: "Test snippet",
312+
Command: "echo 'Hello, World!'",
313+
Tag: []string{"test"},
314+
Output: "Hello, World!",
315+
},
316+
{
317+
Description: "Test snippet 2",
318+
Command: "echo 'Hello, World 2!'",
319+
Tag: []string{"test", "test2"},
320+
Output: "Hello, World 2!",
321+
},
322+
{
323+
Description: "Test snippet 3",
324+
Command: "echo 'Hello, World 3!'",
325+
Tag: []string{"test", "test3"},
326+
Output: "Hello, World 3!",
327+
},
328+
},
329+
}
330+
331+
// Filter by a single tag
332+
filteredSnippets := snippets.FilterByTags([]string{"test"})
333+
assert.Len(t, filteredSnippets, 3)
334+
assert.Equal(t, "Test snippet", filteredSnippets[0].Description)
335+
assert.Equal(t, "Test snippet 2", filteredSnippets[1].Description)
336+
337+
// Filter by multiple tags
338+
filteredSnippets = snippets.FilterByTags([]string{"test", "test2"})
339+
assert.Len(t, filteredSnippets, 3)
340+
assert.Equal(t, "Test snippet", filteredSnippets[0].Description)
341+
assert.Equal(t, "Test snippet 2", filteredSnippets[1].Description)
342+
assert.Equal(t, "Test snippet 3", filteredSnippets[2].Description)
343+
}

0 commit comments

Comments
 (0)