CCCPaste

xxd -i but for go

package xxdgo

import (
	"fmt"
	"io"
	"os"
	"strings"

	"github.com/spf13/cobra"
)

var (
	space string
	lineBreak int
)

func init() {
	Cmd.Flags().StringVarP(&space, "spaces", "s", "   ", "how much space to use after every break line")
	Cmd.Flags().IntVarP(&lineBreak, "break", "b", 12, "after how many items to add a new break line")
}

var Cmd = &cobra.Command{
	Long: "xxd -i but for go",
	
	Use: "xxdgo file_name",

	Example: `xxdgo image.png -s "	" -b 16 >> rawbytes.go`,

	Args: cobra.ExactArgs(1),

	RunE: func(cmd *cobra.Command, args []string) error {
		file, err := os.OpenFile(args[0], os.O_RDONLY, 0444)

		if err != nil {
			return err
		}

		defer file.Close()

		fileBytes, err := io.ReadAll(file)

		if err != nil {
			return err
		}

		var s strings.Builder

		s.WriteString(`var `)

		var varName = strings.ReplaceAll(file.Name(), ".", "_")
		var upperName = strings.ToUpper(string(varName[0])) + varName[1:]

		s.WriteString(upperName)
		s.WriteString(` []byte = []byte{`)
		s.WriteString("\n")
		s.WriteString(space)

		for i, b := range fileBytes {
			s.WriteString(`0x`)

			var hexB = fmt.Sprintf("%x", b)

			if len(hexB) == 1 {
				s.WriteString("0")
			}
	
			s.WriteString(hexB)
			s.WriteString(", ")

			if (i + 1) % lineBreak == 0 {
				s.WriteString("\n")
				s.WriteString(space)
			}
		}

		s.WriteString("\n")
		s.WriteString("}")

		fmt.Println(s.String())

		return nil
	},
}