Commit 11a5c7e

Karn Wong <karn@karnwong.me>
2025-07-28 03:44:40
refactor(shouldideploytoday): move to internal
1 parent 6b838fb
Changed files (4)
cmd/shouldideploytoday.go
@@ -1,54 +1,15 @@
 package cmd
 
 import (
-	"fmt"
-	"time"
-
-	"context"
-
-	"github.com/carlmjohnson/requests"
-	"github.com/kahnwong/swissknife/color"
-	"github.com/rs/zerolog/log"
+	"github.com/kahnwong/swissknife/internal/shouldideploytoday"
 	"github.com/spf13/cobra"
 )
 
-type ShouldIDeploy struct {
-	Timezone      string    `json:"timezone"`
-	Date          time.Time `json:"date"`
-	ShouldIDeploy bool      `json:"shouldideploy"`
-	Message       string    `json:"message"`
-}
-
-func ShouldIDeployToday() ShouldIDeploy {
-	url := "https://shouldideploy.today"
-
-	var response ShouldIDeploy
-	err := requests.
-		URL(url).
-		Path("api").
-		Param("tz", "UTC").
-		Param("date", time.Now().UTC().Format("2006-01-02T15:04:05.000Z")).
-		ToJSON(&response).
-		Fetch(context.Background())
-
-	if err != nil {
-		log.Fatal().Msg("Error calling ShouldIDeploy API")
-	}
-
-	return response
-}
-
 var ShouldIDeployTodayCmd = &cobra.Command{
 	Use:   "shouldideploytoday",
 	Short: "Should I deploy today?",
 	Run: func(cmd *cobra.Command, args []string) {
-		response := ShouldIDeployToday()
-
-		if response.ShouldIDeploy {
-			fmt.Printf("%s\n", color.Green(response.Message))
-		} else if !response.ShouldIDeploy {
-			fmt.Printf("%s\n", color.Red(response.Message))
-		}
+		shouldideploytoday.ShouldIDeployToday()
 	},
 }
 
configs/colors.go
@@ -0,0 +1,19 @@
+package configs
+
+import "github.com/fatih/color"
+
+type ColorsStruct struct {
+	Green   func(a ...interface{}) string
+	Magenta func(a ...interface{}) string
+	Red     func(a ...interface{}) string
+	Yellow  func(a ...interface{}) string
+	Blue    func(a ...interface{}) string
+}
+
+var Colors = ColorsStruct{
+	Green:   color.New(color.FgHiGreen).SprintFunc(),
+	Magenta: color.New(color.FgHiMagenta).SprintFunc(),
+	Red:     color.New(color.FgRed).SprintFunc(),
+	Yellow:  color.New(color.FgYellow).SprintFunc(),
+	Blue:    color.New(color.FgBlue).SprintFunc(),
+}
internal/shouldideploytoday/shouldideploytoday.go
@@ -0,0 +1,47 @@
+package shouldideploytoday
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"github.com/carlmjohnson/requests"
+	"github.com/kahnwong/swissknife/configs"
+	"github.com/rs/zerolog/log"
+)
+
+type ShouldIDeploy struct {
+	Timezone      string    `json:"timezone"`
+	Date          time.Time `json:"date"`
+	ShouldIDeploy bool      `json:"shouldideploy"`
+	Message       string    `json:"message"`
+}
+
+func getResponse() ShouldIDeploy {
+	url := "https://shouldideploy.today"
+
+	var response ShouldIDeploy
+	err := requests.
+		URL(url).
+		Path("api").
+		Param("tz", "UTC").
+		Param("date", time.Now().UTC().Format("2006-01-02T15:04:05.000Z")).
+		ToJSON(&response).
+		Fetch(context.Background())
+
+	if err != nil {
+		log.Fatal().Msg("Error calling ShouldIDeploy API")
+	}
+
+	return response
+}
+
+func ShouldIDeployToday() {
+	response := getResponse()
+
+	if response.ShouldIDeploy {
+		fmt.Printf("%s\n", configs.Colors.Green(response.Message))
+	} else if !response.ShouldIDeploy {
+		fmt.Printf("%s\n", configs.Colors.Red(response.Message))
+	}
+}
go.sum
@@ -113,8 +113,6 @@ github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo
 github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
-golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
 golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
 golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
 golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561 h1:MDc5xs78ZrZr3HMQugiXOAkSZtfTpbJLDr/lwfgO53E=
@@ -123,13 +121,9 @@ golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPI
 golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
-golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
 golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
 golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
-golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
 golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
 golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -140,15 +134,11 @@ golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
-golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
 golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
 golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
-golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
-golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
+golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg=
+golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
-golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
 golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
 golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
 golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=