summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
authoreltrac <hi@eltr.ac>2026-05-26 09:34:40 +0800
committereltrac <hi@eltr.ac>2026-05-26 09:34:40 +0800
commit6ab2a444250bb79aed3f65917ef28d32e90e69eb (patch)
treedad67c8dfb9885d3cf936584a984580c07c4d29a /main.go
parent98390e99385b9886127f28c0d521b3f3ddb94ccc (diff)
feat: fetch data from multiple sources and update when new one comes
Diffstat (limited to 'main.go')
-rw-r--r--main.go94
1 files changed, 66 insertions, 28 deletions
diff --git a/main.go b/main.go
index 8796971..b30b665 100644
--- a/main.go
+++ b/main.go
@@ -7,6 +7,7 @@ import (
"os"
"slices"
"sort"
+ "sync"
"github.com/fatih/color"
"github.com/urfave/cli/v3"
@@ -45,11 +46,49 @@ func main() {
}
pkgName := cmd.Args().First()
- // search and print
+ fmt.Print("\033[s")
showLoadingPrompt(fmt.Sprintf("What the heck is \"%s\"", pkgName))
- stat := fetchToCreateStatistics(pkgName)
- hideLoadingPrompt()
- stat.Print()
+
+ // try reading from cache
+ var stat *statistics
+ if NoCache {
+ stat = &statistics{PkgName: pkgName}
+ } else {
+ stat = NewStatisticsFromCache(pkgName)
+ if stat == nil {
+ stat = &statistics{PkgName: pkgName}
+ }
+ }
+ fmlChan := make(chan *FormulaInfo)
+ caskChan := make(chan *CaskInfo)
+ rvsChan := make(chan []string)
+ fetchData(pkgName, fmlChan, caskChan, rvsChan)
+ var wg sync.WaitGroup
+ wg.Add(1)
+ go func(){
+ defer wg.Done()
+ var fml *FormulaInfo
+ var cask *CaskInfo
+ var rvs []string
+ remaining := 3
+ for remaining > 0 {
+ select {
+ case v := <-fmlChan:
+ fml = v
+ remaining--
+ case v := <-caskChan:
+ cask = v
+ remaining--
+ case v := <-rvsChan:
+ rvs = v
+ remaining--
+ }
+ fmt.Print("\033[u\033[J")
+ stat = NewStatistics(fml, cask, pkgName, rvs)
+ stat.Print()
+ }
+ }()
+ wg.Wait()
// cache
if !NoCache {
@@ -153,30 +192,29 @@ func main() {
}
}
-func fetchToCreateStatistics(pkgName string) *statistics {
- // try reading from cache
- var stat *statistics
- if !NoCache {
- stat = NewStatisticsFromCache(pkgName)
- }
- // if cache not hit or explicitly requested no cache
- if NoCache || stat == nil {
- fmlChan := make(chan *FormulaInfo)
- caskChan := make(chan *CaskInfo)
- rvsChan := make(chan []string)
- // start 2 goroutines, fetching formula/cask info and uses
- go func() {
- formula, cask := GetBrewInfo(pkgName)
- fmlChan <- formula
- caskChan <- cask
- }()
- go func() {
- rvsChan <- GetBrewUses(pkgName)
- }()
- // create fine-grained data out of raw
- stat = NewStatistics(<-fmlChan, <-caskChan, pkgName, <-rvsChan)
- }
- return stat
+func fetchData(pkgName string,
+ fmlChan chan *FormulaInfo,
+ caskChan chan *CaskInfo,
+ rvsChan chan []string) {
+ // fetching formula/cask info and uses
+ // async from brew CLI and HTTP API
+ // use whoever comes first
+ go func() {
+ formula, cask := GetBrewInfo(pkgName)
+ fmlChan <- formula
+ caskChan <- cask
+ }()
+ go func() {
+ fmlChan <- GetFormulaFromAPI(pkgName)
+ }()
+ go func() {
+ caskChan <- GetCaskFromAPI(pkgName)
+ }()
+
+ // fetching brew uses
+ go func() {
+ rvsChan <- GetBrewUses(pkgName)
+ }()
}
func printErrorAndExit(msg string) {