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
},
}