Modify `FunctionCall` struct to handle arguments as strings. Add debugging logs to facilitate error tracing and improve JSON unmarshalling in various functions.
58 lines
1.1 KiB
Go
58 lines
1.1 KiB
Go
package search
|
|
|
|
import (
|
|
"answer/pkg/cache"
|
|
"context"
|
|
googlesearch "github.com/rocketlaunchr/google-search"
|
|
"log/slog"
|
|
"sort"
|
|
)
|
|
|
|
type Google struct {
|
|
Cache cache.Cache
|
|
}
|
|
|
|
var _ Search = Google{}
|
|
|
|
func (g Google) Search(ctx context.Context, search string) ([]Result, error) {
|
|
var res []Result
|
|
|
|
key := "google:" + search
|
|
|
|
err := g.Cache.GetJSON(key, &res)
|
|
|
|
slog.Info("searching", "search", search, "results", res, "err", err)
|
|
|
|
if err == nil {
|
|
return res, nil
|
|
}
|
|
|
|
results, err := googlesearch.Search(ctx, search, googlesearch.SearchOptions{
|
|
|
|
UserAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36",
|
|
})
|
|
|
|
slog.Info("searched", "search", search, "results", results, "err", err)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// just in case, sort the res by rank, as the api does not mention it is sorted
|
|
sort.Slice(res, func(i, j int) bool {
|
|
return results[i].Rank < results[j].Rank
|
|
})
|
|
|
|
for _, r := range results {
|
|
res = append(res, Result{
|
|
Title: r.Title,
|
|
URL: r.URL,
|
|
Description: r.Description,
|
|
})
|
|
}
|
|
|
|
_ = g.Cache.SetJSON(key, res)
|
|
|
|
return res, nil
|
|
}
|