Borg/pkg/ui/quote.go
google-labs-jules[bot] 7adfff1d0d feat: Add TDD framework and fix build error
This commit introduces a TDD testing framework for the `collect` commands and resolves a build failure.

- A `TDD/` directory has been added to house tests for the `collect` commands.
- An environment variable `BORG_PLEXSUS=0` has been implemented to enable a mock mode, which prevents external network calls during testing.
- The `collect` commands have been updated to use the command's output streams, allowing for output capturing in tests.
- A `pkg/mocks` package has been added to provide mock implementations for testing.
- The `.gitignore` file has been updated to exclude generated `.datanode` files.
- The "flag redefined" build error has been fixed by refactoring the root command initialization in `cmd/root.go` to prevent duplicate flag definitions.
2025-11-02 18:11:04 +00:00

128 lines
3 KiB
Go

package ui
import (
"encoding/json"
"fmt"
"math/rand"
"sync"
"time"
"github.com/Snider/Borg/data"
"github.com/fatih/color"
)
var (
cachedQuotes *Quotes
quotesOnce sync.Once
quotesErr error
)
func init() {
rand.Seed(time.Now().UnixNano())
}
type Quotes struct {
InitWorkAssimilate []string `json:"init_work_assimilate"`
EncryptionServiceMessages []string `json:"encryption_service_messages"`
CodeRelatedShort []string `json:"code_related_short"`
VCSProcessing []string `json:"vcs_processing"`
PWAProcessing []string `json:"pwa_processing"`
CodeRelatedLong []string `json:"code_related_long"`
ImageRelated struct {
PNG string `json:"png"`
JPG string `json:"jpg"`
SVG string `json:"svg"`
WEBP string `json:"webp"`
HEIC string `json:"heic"`
RAW string `json:"raw"`
ICO string `json:"ico"`
AVIF string `json:"avif"`
TIFF string `json:"tiff"`
GIF string `json:"gif"`
} `json:"image_related"`
}
func loadQuotes() (*Quotes, error) {
quotesFile, err := data.QuotesJSON.ReadFile("quotes.json")
if err != nil {
return nil, fmt.Errorf("failed to read quotes.json: %w", err)
}
var quotes Quotes
if err := json.Unmarshal(quotesFile, &quotes); err != nil {
return nil, fmt.Errorf("failed to unmarshal quotes.json: %w", err)
}
return &quotes, nil
}
func getQuotes() (*Quotes, error) {
quotesOnce.Do(func() {
cachedQuotes, quotesErr = loadQuotes()
})
return cachedQuotes, quotesErr
}
func GetRandomQuote() (string, error) {
quotes, err := getQuotes()
if err != nil {
return "", err
}
allQuotes := []string{}
allQuotes = append(allQuotes, quotes.InitWorkAssimilate...)
allQuotes = append(allQuotes, quotes.EncryptionServiceMessages...)
allQuotes = append(allQuotes, quotes.CodeRelatedShort...)
allQuotes = append(allQuotes, quotes.VCSProcessing...)
allQuotes = append(allQuotes, quotes.PWAProcessing...)
allQuotes = append(allQuotes, quotes.CodeRelatedLong...)
if len(allQuotes) == 0 {
return "", fmt.Errorf("no quotes available")
}
return allQuotes[rand.Intn(len(allQuotes))], nil
}
func PrintQuote() {
quote, err := GetRandomQuote()
if err != nil {
fmt.Println("Error getting quote:", err)
return
}
c := color.New(color.FgGreen)
c.Println(quote)
}
func GetVCSQuote() (string, error) {
quotes, err := getQuotes()
if err != nil {
return "", err
}
if len(quotes.VCSProcessing) == 0 {
return "", fmt.Errorf("no VCS quotes available")
}
return quotes.VCSProcessing[rand.Intn(len(quotes.VCSProcessing))], nil
}
func GetPWAQuote() (string, error) {
quotes, err := getQuotes()
if err != nil {
return "", err
}
if len(quotes.PWAProcessing) == 0 {
return "", fmt.Errorf("no PWA quotes available")
}
return quotes.PWAProcessing[rand.Intn(len(quotes.PWAProcessing))], nil
}
func GetWebsiteQuote() (string, error) {
quotes, err := getQuotes()
if err != nil {
return "", err
}
if len(quotes.CodeRelatedLong) == 0 {
return "", fmt.Errorf("no website quotes available")
}
return quotes.CodeRelatedLong[rand.Intn(len(quotes.CodeRelatedLong))], nil
}