Commit 58d43d6

Karn Wong <[email protected]>
2025-07-28 04:00:49
refactor(generateKey): move to internal
1 parent a17bc21
Changed files (3)
cmd
internal
cmd/generate/generate_key.go
@@ -1,37 +1,16 @@
 package generate
 
 import (
-	"crypto/rand"
-	"encoding/base64"
-	"fmt"
-
-	"github.com/kahnwong/swissknife/utils"
-	"github.com/rs/zerolog/log"
+	"github.com/kahnwong/swissknife/internal/generate"
 	"github.com/spf13/cobra"
 )
 
-func generateKey(n int) string {
-	// https://stackoverflow.com/questions/32349807/how-can-i-generate-a-random-int-using-the-crypto-rand-package/32351471#32351471
-	// generate random bytes
-	b := make([]byte, n)
-	_, err := rand.Read(b)
-	// Note that err == nil only if we read len(b) bytes.
-	if err != nil {
-		log.Fatal().Msg("Failed to generate random bytes")
-	}
-
-	// convert to base64
-	return base64.URLEncoding.EncodeToString(b)
-}
-
 var generateKeyCmd = &cobra.Command{
 	Use:   "key",
 	Short: "Generate key",
 	Long:  `Generate key. Re-implementation of "openssl rand -base64 48"". Result is copied to clipboard.`,
 	Run: func(cmd *cobra.Command, args []string) {
-		key := generateKey(48)
-		utils.WriteToClipboard(key)
-		fmt.Printf("%s\n", key)
+		generate.Key()
 	},
 }
 
internal/generate/key.go
@@ -0,0 +1,30 @@
+package generate
+
+import (
+	"crypto/rand"
+	"encoding/base64"
+	"fmt"
+
+	"github.com/kahnwong/swissknife/internal/utils"
+	"github.com/rs/zerolog/log"
+)
+
+func generateKey(n int) string {
+	// https://stackoverflow.com/questions/32349807/how-can-i-generate-a-random-int-using-the-crypto-rand-package/32351471#32351471
+	// generate random bytes
+	b := make([]byte, n)
+	_, err := rand.Read(b)
+	// Note that err == nil only if we read len(b) bytes.
+	if err != nil {
+		log.Fatal().Msg("Failed to generate random bytes")
+	}
+
+	// convert to base64
+	return base64.URLEncoding.EncodeToString(b)
+}
+
+func Key() {
+	key := generateKey(48)
+	utils.WriteToClipboard(key)
+	fmt.Printf("%s\n", key)
+}
internal/utils/clipboard.go
@@ -0,0 +1,44 @@
+package utils
+
+import (
+	"os"
+
+	"github.com/atotto/clipboard"
+	"github.com/rs/zerolog/log"
+	clipboardImage "github.com/skanehira/clipboard-image"
+)
+
+func WriteToClipboard(text string) {
+	err := clipboard.WriteAll(text)
+	if err != nil {
+		log.Error().Msg("Failed to write to clipboard")
+	}
+}
+
+func WriteToClipboardImage(bytes []byte) {
+	tempFilename := "/tmp/qr-image.png"
+	err := os.WriteFile(tempFilename, bytes, 0644)
+	if err != nil {
+		log.Fatal().Msg("Failed to write temp image for clipboard")
+	}
+
+	f, err := os.Open(tempFilename)
+	if err != nil {
+		log.Fatal().Msg("Failed to open temp image for clipboard")
+	}
+	defer func(f *os.File) {
+		err := f.Close()
+		if err != nil {
+			log.Error().Msg("Error opening temp image for clipboard")
+		}
+	}(f)
+
+	if err = clipboardImage.CopyToClipboard(f); err != nil {
+		log.Fatal().Msg("Failed to copy to clipboard")
+	}
+}
+
+func ReadFromClipboard() string {
+	text, _ := clipboard.ReadAll()
+	return text
+}