This repository has been archived by the owner on Jan 7, 2024. It is now read-only.
/
search.go
96 lines (81 loc) · 1.94 KB
/
search.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package main
import (
"fmt"
"os"
"sort"
"strings"
"text/tabwriter"
"text/template"
"facette.io/natsort"
_ "github.com/blevesearch/bleve/config"
"github.com/urfave/cli/v2"
"mkdeb.sh/catalog"
)
var searchCommand = &cli.Command{
Name: "search",
Usage: "Search for recipes",
ArgsUsage: "[TERM]",
Action: execSearch,
Flags: []cli.Flag{
&cli.BoolFlag{
Name: "description, desc",
Usage: "Include recipes description when searching",
},
&cli.StringFlag{
Name: "format",
Usage: "Output template format",
},
},
}
func execSearch(ctx *cli.Context) error {
if ctx.NArg() > 1 {
cli.ShowCommandHelpAndExit(ctx, "search", 1)
}
if !catalog.Ready(catalogDir) {
err := ctx.App.Run([]string{ctx.App.Name, "repo", "add", catalog.DefaultRepository})
if err != nil {
return err
}
}
c, err := catalog.New(catalogDir)
if err != nil {
return fmt.Errorf("cannot initialize catalog: %w", err)
}
defer c.Close()
term := ctx.Args().First()
hits, err := c.Search(term, ctx.Bool("desc"))
if err != nil {
return fmt.Errorf("cannot search catalog: %w", err)
}
if len(hits) == 0 {
if term != "" {
fmt.Printf("No match found for %q\n", term)
} else {
fmt.Println("No match found")
}
return nil
}
sort.Slice(hits, func(i, j int) bool {
return natsort.Compare(hits[i].Repository+"/"+hits[i].Name, hits[j].Repository+"/"+hits[j].Name)
})
format := ctx.String("format")
if format == "" {
format = "{{ if ne .Repository \"" + catalog.DefaultRepository +
"\" }}{{ .Repository }}/{{ end }}{{ .Name }}\t{{ .Description }}\n"
} else {
format = strings.TrimSpace(format) + "\n"
}
tmpl, err := template.New("").Parse(format)
if err != nil {
return fmt.Errorf("invalid format: %w", err)
}
tr := tabwriter.NewWriter(os.Stdout, 0, 0, 3, ' ', 0)
for _, hit := range hits {
err = tmpl.Execute(tr, hit)
if err != nil {
return fmt.Errorf("cannot execute template: %w", err)
}
}
tr.Flush()
return nil
}