Skip to content

Commit 6afb450

Browse files
committed
chore(mewn): add mewn
1 parent 798f9bc commit 6afb450

File tree

1 file changed

+149
-0
lines changed

1 file changed

+149
-0
lines changed

cmd/mewn/main.go

+149
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"io/ioutil"
6+
"log"
7+
"os"
8+
"os/exec"
9+
"path/filepath"
10+
11+
"github.com/leaanthony/mewn/lib"
12+
)
13+
14+
var version = "0.0.0"
15+
var commit = ""
16+
var date = "Now"
17+
18+
type arglist struct {
19+
args []string
20+
}
21+
22+
func newArglist() *arglist {
23+
return &arglist{}
24+
}
25+
26+
func (a *arglist) addArgs(args []string) {
27+
a.args = append(a.args, args...)
28+
}
29+
30+
func (a *arglist) hasMoreArgs() bool {
31+
return len(a.args) > 0
32+
}
33+
34+
func (a *arglist) pop() string {
35+
if !a.hasMoreArgs() {
36+
return ""
37+
}
38+
result := a.args[0]
39+
a.args = a.args[1:]
40+
return result
41+
}
42+
43+
func (a *arglist) peek() string {
44+
if !a.hasMoreArgs() {
45+
return ""
46+
}
47+
return a.args[0]
48+
}
49+
50+
func (a *arglist) popAll() []string {
51+
result := a.args
52+
a.args = []string{}
53+
return result
54+
}
55+
56+
func main() {
57+
58+
message := ""
59+
if len(commit) > 5 {
60+
message = fmt.Sprintf("v%s (%s - %s)", version, commit[0:5], date)
61+
}
62+
63+
fmt.Printf("Mewn %s\n", message)
64+
65+
args := newArglist()
66+
if len(os.Args) > 0 {
67+
args.addArgs(os.Args[1:])
68+
}
69+
// Print help
70+
if args.peek() == "--help" {
71+
fmt.Println()
72+
fmt.Println("Mewn is a tool for packing assets into your Go binary. This cli tool generates asset bundles and can also act as a replacement for go build, where it will pack, compile and clean up in one step.")
73+
fmt.Println()
74+
fmt.Println("Usage: mewn [-i] [build|pack]")
75+
fmt.Println()
76+
fmt.Println("Flags:")
77+
fmt.Println(" -i Ignore files that don't exist")
78+
fmt.Println()
79+
fmt.Println("Subcommands:")
80+
fmt.Println(" build Generates asset packs, calls 'go build' then cleans up")
81+
fmt.Println(" pack Same as build, except will compile with '-w -s' flags")
82+
fmt.Println()
83+
fmt.Println("More information at https://github.com/leaanthony/mewn")
84+
fmt.Println()
85+
os.Exit(0)
86+
}
87+
88+
var ignoreErrors = false
89+
if args.peek() == "-i" {
90+
ignoreErrors = true
91+
args.pop()
92+
}
93+
94+
buildMode := ""
95+
buildArgs := []string{}
96+
if args.peek() == "build" || args.peek() == "pack" {
97+
buildMode = args.pop()
98+
buildArgs = args.popAll()
99+
}
100+
101+
mewnFiles := lib.GetMewnFiles(args.popAll(), ignoreErrors)
102+
103+
if len(mewnFiles) == 0 {
104+
fmt.Println("No files found to process.")
105+
os.Exit(1)
106+
}
107+
referencedAssets, err := lib.GetReferencedAssets(mewnFiles)
108+
if err != nil {
109+
log.Fatal(err)
110+
}
111+
112+
targetFiles := []string{}
113+
114+
for _, referencedAsset := range referencedAssets {
115+
packfileData, err := lib.GeneratePackFileString(referencedAsset, ignoreErrors)
116+
if err != nil {
117+
log.Fatal(err)
118+
}
119+
targetFile := filepath.Join(referencedAsset.BaseDir, referencedAsset.PackageName+"-mewn.go")
120+
targetFiles = append(targetFiles, targetFile)
121+
ioutil.WriteFile(targetFile, []byte(packfileData), 0644)
122+
}
123+
124+
if buildMode == "build" || buildMode == "pack" {
125+
126+
var cmdargs []string
127+
128+
cmdargs = append(cmdargs, "build")
129+
cmdargs = append(cmdargs, buildArgs...)
130+
if buildMode == "pack" {
131+
cmdargs = append(cmdargs, "-ldflags")
132+
cmdargs = append(cmdargs, "-w -s")
133+
}
134+
cmd := exec.Command("go", cmdargs...)
135+
stdoutStderr, err := cmd.CombinedOutput()
136+
if err != nil {
137+
fmt.Printf("Error running command! %s\n", err.Error())
138+
fmt.Printf("From program: %s\n", stdoutStderr)
139+
}
140+
141+
// Remove target Files
142+
for _, filename := range targetFiles {
143+
err := os.Remove(filename)
144+
if err != nil {
145+
log.Fatal(err)
146+
}
147+
}
148+
}
149+
}

0 commit comments

Comments
 (0)