gonicembed: fix lint errors and refactor

This commit is contained in:
sentriz
2020-05-02 04:18:46 +01:00
parent 31b2b65ea6
commit 3f9f050a7d

View File

@@ -6,14 +6,40 @@ import (
"io" "io"
"log" "log"
"os" "os"
"path/filepath"
"strings" "strings"
"time"
"github.com/peterbourgon/ff" "github.com/peterbourgon/ff"
"go.senan.xyz/gonic/version" "go.senan.xyz/gonic/version"
) )
type errWriter struct {
w io.Writer
err error
}
func (ew *errWriter) write(buf []byte) {
if ew.err != nil {
return
}
_, ew.err = ew.w.Write(buf)
}
func (ew *errWriter) printf(format string, a ...interface{}) {
if ew.err != nil {
return
}
_, ew.err = fmt.Fprintf(ew.w, format, a...)
}
func (ew *errWriter) println(a ...interface{}) {
if ew.err != nil {
return
}
_, ew.err = fmt.Fprintln(ew.w, a...)
}
// once i had this written with ~100% text/template but it was very // once i had this written with ~100% text/template but it was very
// slow. now this thing is not nice on the eyes or easy to change // slow. now this thing is not nice on the eyes or easy to change
// but it's pretty fast. which i needed it to for live reloading stuff // but it's pretty fast. which i needed it to for live reloading stuff
@@ -21,8 +47,7 @@ import (
const ( const (
byteCols = 24 byteCols = 24
// ** begin file template // ** begin file template
fileHeader = `// file generated with embed tool fileHeader = `// file generated with embed tool; DO NOT EDIT.
// do not edit
// %s // %s
package %s package %s
import "time" import "time"
@@ -50,69 +75,60 @@ type config struct {
assetPathPrefix string assetPathPrefix string
} }
type file struct { func processAsset(c config, ew *errWriter, path string) error {
data io.ReadSeeker info, err := os.Stat(path)
path string if err != nil {
modTime time.Time return fmt.Errorf("stating asset: %w", err)
} }
if info.IsDir() {
//nolint:errcheck return nil
func processAsset(c *config, f *file, out io.Writer) { }
out.Write([]byte(fmt.Sprintf(assetHeader, data, err := os.Open(filepath.Clean(path))
strings.TrimPrefix(f.path, c.assetPathPrefix), if err != nil {
f.modTime.Unix(), return fmt.Errorf("opening asset: %w", err)
}
defer data.Close()
ew.write([]byte(fmt.Sprintf(assetHeader,
strings.TrimPrefix(path, c.assetPathPrefix),
info.ModTime().Unix(),
))) )))
defer out.Write([]byte(assetFooter))
buffer := make([]byte, byteCols) buffer := make([]byte, byteCols)
for { for {
read, err := f.data.Read(buffer) read, err := data.Read(buffer)
for i := 0; i < read; i++ { for i := 0; i < read; i++ {
fmt.Fprintf(out, "0x%02x,", buffer[i]) ew.printf("0x%02x,", buffer[i])
} }
if err != nil { if err != nil {
break break
} }
fmt.Fprintln(out) ew.println()
} }
ew.write([]byte(assetFooter))
return ew.err
} }
//nolint:errcheck //nolint:errcheck
func processAssets(c *config, files []string) error { func processAssets(c config, files []string) error {
outWriter, err := os.Create(c.outPath) out, err := os.Create(c.outPath)
if err != nil { if err != nil {
return fmt.Errorf("creating out path: %w", err) return fmt.Errorf("creating out path: %w", err)
} }
ew := &errWriter{w: out}
if c.tagList != "" { if c.tagList != "" {
c.tagList = fmt.Sprintf("+build %s", c.tagList) c.tagList = fmt.Sprintf("+build %s", c.tagList)
} }
outWriter.Write([]byte(fmt.Sprintf(fileHeader, ew.write([]byte(fmt.Sprintf(fileHeader,
c.tagList, c.tagList,
c.packageName, c.packageName,
c.assetsVarName, c.assetsVarName,
))) )))
defer outWriter.Write([]byte(fileFooter)) defer ew.write([]byte(fileFooter))
for _, path := range files { for _, path := range files {
info, err := os.Stat(path) if err := processAsset(c, ew, path); err != nil {
if err != nil { return fmt.Errorf("processing asset: %w", err)
return fmt.Errorf("stating asset: %w", err)
} }
if info.IsDir() {
continue
}
data, err := os.Open(path)
if err != nil {
return fmt.Errorf("opening asset: %w", err)
}
defer data.Close()
processAsset(c, &file{
data: data,
path: path,
modTime: info.ModTime(),
},
outWriter,
)
} }
return nil return ew.err
} }
func main() { func main() {
@@ -128,7 +144,7 @@ func main() {
if *outPath == "" { if *outPath == "" {
log.Fatalln("invalid arguments. see -h") log.Fatalln("invalid arguments. see -h")
} }
c := &config{ c := config{
packageName: *pkgName, packageName: *pkgName,
outPath: *outPath, outPath: *outPath,
tagList: *tagList, tagList: *tagList,