From f86af5a34c2abe9edc162c3e177fc4622505bb75 Mon Sep 17 00:00:00 2001 From: jolheiser Date: Mon, 24 Oct 2022 23:06:55 -0500 Subject: [PATCH] add structure Signed-off-by: jolheiser --- main.go | 72 ++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 48 insertions(+), 24 deletions(-) diff --git a/main.go b/main.go index 1b2636e..cb969b0 100644 --- a/main.go +++ b/main.go @@ -11,56 +11,80 @@ import ( ) func main() { - repos, err := trending("rust", []string{"daily", "weekly", "monthly"}) - if err != nil { - log.WithError(err).Fatal("could not get trending repositories") - } - for _, repo := range repos { - log.Info(repo) + languages := []string{"go", "rust"} + + for _, lang := range languages { + l, err := trendingLang(lang, []string{"daily", "weekly", "monthly"}) + if err != nil { + log.WithError(err).Fatal("could not get trending repositories") + } + log.Styles[log.InfoLevel] = lipgloss.NewStyle().Foreground(lipgloss.Color(l.color)).Bold(true) + log.Info(lang) + log.IncreasePadding() + for _, repo := range l.repositories { + log.WithField("link", repo.link()).Info(repo.name) + } + log.ResetPadding() } } -func trending(lang string, timeframes []string) ([]string, error) { - repoMap := make(map[string]struct{}) +func trendingLang(lang string, timeframes []string) (language, error) { + l := language{ + repositories: make([]repository, 0), + } + repoMap := make(map[repository]struct{}) for _, timeframe := range timeframes { - rs, err := trendingFrame(lang, timeframe) + la, err := trendingRepos(lang, timeframe) if err != nil { - return nil, err + return la, err } - for _, r := range rs { + l.color = la.color + for _, r := range la.repositories { repoMap[r] = struct{}{} } } - var repos []string for repo := range repoMap { - repos = append(repos, repo) + l.repositories = append(l.repositories, repo) } - return repos, nil + return l, nil } -func trendingFrame(lang, timeframe string) ([]string, error) { +func trendingRepos(lang, timeframe string) (language, error) { u := fmt.Sprintf("https://github.com/trending/%s?since=%s", lang, timeframe) res, err := http.Get(u) if err != nil { - return nil, err + return language{}, err } defer res.Body.Close() doc, err := goquery.NewDocumentFromReader(res.Body) if err != nil { - return nil, err + return language{}, err } - var repos []string + var l language doc.Find(".Box-row").Each(func(_ int, s *goquery.Selection) { - // TODO Only do this once per lang - rlcStyle, _ := s.Find(".repo-language-color").Attr("style") - rlc := strings.Fields(rlcStyle)[1] - log.Styles[log.InfoLevel] = lipgloss.NewStyle().Foreground(lipgloss.Color(rlc)).Bold(true) + if l.color == "" { + rlcStyle, _ := s.Find(".repo-language-color").Attr("style") + l.color = strings.Fields(rlcStyle)[1] + } e := s.Find("h1 a") repo := strings.Join(strings.Fields(e.Text()), "") - repos = append(repos, repo) + l.repositories = append(l.repositories, repository{name: repo}) }) - return repos, nil + return l, nil +} + +type language struct { + color string + repositories []repository +} + +type repository struct { + name string +} + +func (r repository) link() string { + return fmt.Sprintf("https://github.com/%s", r.name) }