diff options
Diffstat (limited to 'main.go')
| -rw-r--r-- | main.go | 94 |
1 files changed, 66 insertions, 28 deletions
@@ -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) { |
