Commit d76b785

Karn Wong <karn@karnwong.me>
2024-11-08 03:19:37
refactor(clipboard): use clipboard lib which doesn't require CGO tag: v0.3.2
1 parent 4ea832b
cmd/generate/generate.go
@@ -3,6 +3,7 @@ package generate
 import (
 	"os"
 
+	"github.com/rs/zerolog/log"
 	"github.com/spf13/cobra"
 )
 
@@ -12,7 +13,10 @@ var Cmd = &cobra.Command{
 	Long:  `Generate stuff`,
 	Run: func(cmd *cobra.Command, args []string) {
 		if len(args) == 0 {
-			cmd.Help()
+			err := cmd.Help()
+			if err != nil {
+				log.Fatal().Err(err).Msg("Failed to display help")
+			}
 			os.Exit(0)
 		}
 	},
cmd/get/get.go
@@ -3,6 +3,8 @@ package get
 import (
 	"os"
 
+	"github.com/rs/zerolog/log"
+
 	"github.com/spf13/cobra"
 )
 
@@ -12,7 +14,10 @@ var Cmd = &cobra.Command{
 	Long:  `Obtain information`,
 	Run: func(cmd *cobra.Command, args []string) {
 		if len(args) == 0 {
-			cmd.Help()
+			err := cmd.Help()
+			if err != nil {
+				log.Fatal().Err(err).Msg("Failed to display help")
+			}
 			os.Exit(0)
 		}
 	},
cmd/speedtest.go
@@ -37,10 +37,10 @@ var SpeedTestCmd = &cobra.Command{
 				log.Fatal().Err(err).Msg("Error testing upload speed")
 			}
 
-			fmt.Printf("" +
+			fmt.Print(
 				fmt.Sprintf("%s:  %s\n", color.Green("Latency"), s.Latency) +
-				fmt.Sprintf("%s: %s\n", color.Green("Download"), s.DLSpeed) +
-				fmt.Sprintf("%s:   %s\n", color.Green("Upload"), s.ULSpeed),
+					fmt.Sprintf("%s: %s\n", color.Green("Download"), s.DLSpeed) +
+					fmt.Sprintf("%s:   %s\n", color.Green("Upload"), s.ULSpeed),
 			)
 
 			s.Context.Reset()
utils/clipboard.go
@@ -1,30 +1,39 @@
 package utils
 
 import (
-	"golang.design/x/clipboard"
+	"os"
+
+	"github.com/atotto/clipboard"
+	"github.com/rs/zerolog/log"
+	clipboardImage "github.com/skanehira/clipboard-image"
 )
 
 func WriteToClipboard(text string) {
-	err := clipboard.Init() // clipboard doesn't work from ssh session
-	if err == nil {         // clipboard doesn't work from ssh session
-		clipboard.Write(clipboard.FmtText, []byte(text))
+	err := clipboard.WriteAll(text)
+	if err != nil {
+		log.Error().Err(err).Msg("Failed to write to clipboard")
 	}
 }
 
 func WriteToClipboardImage(bytes []byte) {
-	err := clipboard.Init()
-	if err == nil {
-		clipboard.Write(clipboard.FmtImage, bytes)
+	tempFilename := "/tmp/qr-image.png"
+	err := os.WriteFile(tempFilename, bytes, 0644)
+	if err != nil {
+		log.Fatal().Err(err).Msg("Failed to write temp image for clipboard")
 	}
-}
 
-func ReadFromClipboard() string {
-	err := clipboard.Init()
-	if err == nil {
+	f, err := os.Open(tempFilename)
+	if err != nil {
+		log.Fatal().Err(err).Msg("Failed to open temp image for clipboard")
+	}
+	defer f.Close()
 
-		s := clipboard.Read(clipboard.FmtText)
-		return string(s)
+	if err = clipboardImage.CopyToClipboard(f); err != nil {
+		log.Fatal().Err(err).Msg("Failed to copy to clipboard")
 	}
+}
 
-	return ""
+func ReadFromClipboard() string {
+	text, _ := clipboard.ReadAll()
+	return text
 }
.pre-commit-config.yaml
@@ -23,11 +23,11 @@ repos:
         exclude: ^.github/dependabot.yaml
 #        exclude: (sops\.yaml)$
   - repo: https://github.com/kahnwong/pre-commit
-    rev: 0eb55ea
+    rev: 71489eb
     hooks:
       - id: go-fmt
       - id: go-vet
       - id: go-imports
-#      - id: golangci-lint
+      - id: golangci-lint
       - id: go-build
       - id: go-mod-tidy
go.mod
@@ -3,6 +3,7 @@ module github.com/kahnwong/swissknife
 go 1.23.2
 
 require (
+	github.com/atotto/clipboard v0.1.4
 	github.com/carlmjohnson/requests v0.24.2
 	github.com/charmbracelet/bubbles v0.20.0
 	github.com/charmbracelet/bubbletea v1.1.2
@@ -14,9 +15,9 @@ require (
 	github.com/sethvargo/go-password v0.3.1
 	github.com/shirou/gopsutil/v4 v4.24.10
 	github.com/showwin/speedtest-go v1.7.9
+	github.com/skanehira/clipboard-image v1.0.0
 	github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
 	github.com/spf13/cobra v1.8.1
-	golang.design/x/clipboard v0.7.0
 	golang.org/x/crypto v0.28.0
 )
 
@@ -45,9 +46,6 @@ require (
 	github.com/tklauser/go-sysconf v0.3.14 // indirect
 	github.com/tklauser/numcpus v0.8.0 // indirect
 	github.com/yusufpapurcu/wmi v1.2.4 // indirect
-	golang.org/x/exp/shiny v0.0.0-20240719175910-8a7402abbf56 // indirect
-	golang.org/x/image v0.18.0 // indirect
-	golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a // indirect
 	golang.org/x/net v0.30.0 // indirect
 	golang.org/x/sync v0.8.0 // indirect
 	golang.org/x/sys v0.26.0 // indirect
go.sum
@@ -1,3 +1,5 @@
+github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
+github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
 github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
 github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
 github.com/carlmjohnson/requests v0.24.2 h1:JDakhAmTIKL/qL/1P7Kkc2INGBJIkIFP6xUeUmPzLso=
@@ -76,6 +78,8 @@ github.com/shirou/gopsutil/v4 v4.24.10 h1:7VOzPtfw/5YDU+jLEoBwXwxJbQetULywoSV4RY
 github.com/shirou/gopsutil/v4 v4.24.10/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8=
 github.com/showwin/speedtest-go v1.7.9 h1:5b3T3U3WSppVXFqsIqF1zdHRYKKVuPNpzFU71HnYNEY=
 github.com/showwin/speedtest-go v1.7.9/go.mod h1:uLgdWCNarXxlYsL2E5TOZpCIwpgSWnEANZp7gfHXHu0=
+github.com/skanehira/clipboard-image v1.0.0 h1:MJ5PeXxDMteS0HCsjvuoMscBi+AtoqCiPX7bZ2OAxDE=
+github.com/skanehira/clipboard-image v1.0.0/go.mod h1:WAxMgBkENpa206RHfrqV/5y8Kq7CitAozlvVxQxa9gs=
 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0=
 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M=
 github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
@@ -90,19 +94,11 @@ github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYg
 github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE=
 github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
 github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
-golang.design/x/clipboard v0.7.0 h1:4Je8M/ys9AJumVnl8m+rZnIvstSnYj1fvzqYrU3TXvo=
-golang.design/x/clipboard v0.7.0/go.mod h1:PQIvqYO9GP29yINEfsEn5zSQKAz3UgXmZKzDA6dnq2E=
 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.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
 golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
-golang.org/x/exp/shiny v0.0.0-20240719175910-8a7402abbf56 h1:8jM66xzUJjNInw31Y8bic4AYSLVChztDRT93+kmofUY=
-golang.org/x/exp/shiny v0.0.0-20240719175910-8a7402abbf56/go.mod h1:3F+MieQB7dRYLTmnncoFbb1crS5lfQoTfDgQy6K4N0o=
-golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ=
-golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E=
 golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a h1:sYbmY3FwUWCBTodZL1S3JUuOvaW6kM2o+clDzzDNBWg=
-golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a/go.mod h1:Ede7gF0KGoHlj822RtphAHK1jLdrcuRBZg0sF1Q+SPc=
 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=