Skip to content

Commit c95dbb4

Browse files
committed
first re-attempt at custom typewriter imports
lots of stuff, including use of cli package; gen get; gen custom
1 parent 3d5eb53 commit c95dbb4

File tree

7 files changed

+232
-19
lines changed

7 files changed

+232
-19
lines changed

custom.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"os"
6+
)
7+
8+
func custom() {
9+
w, err := os.Create("_gen.go")
10+
11+
if err != nil {
12+
fmt.Println(err)
13+
return
14+
}
15+
16+
defer w.Close()
17+
18+
p := pkg{
19+
Name: "main",
20+
Imports: stdImports,
21+
Main: false,
22+
}
23+
24+
write(w, p)
25+
}

get.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package main
2+
3+
import (
4+
"bytes"
5+
"fmt"
6+
"go/parser"
7+
"go/token"
8+
"os"
9+
"os/exec"
10+
"strings"
11+
)
12+
13+
func get(u bool) {
14+
imports := make([]string, 0)
15+
16+
if _, err := os.Open("_gen.go"); err == nil {
17+
// custom file exists, parse its imports
18+
fset := token.NewFileSet()
19+
if f, err := parser.ParseFile(fset, "_gen.go", nil, parser.ImportsOnly); err == nil {
20+
for _, v := range f.Imports {
21+
imports = append(imports, v.Path.Value)
22+
}
23+
}
24+
} else {
25+
// doesn't exist, use standard
26+
imports = append(imports, stdImports...)
27+
}
28+
29+
// clean `em up, hacky; TODO: a better way
30+
for i := range imports {
31+
imports[i] = strings.Trim(imports[i], `_ "`)
32+
}
33+
34+
get := []string{"get"}
35+
if u {
36+
get = append(get, "-u")
37+
}
38+
39+
get = append(get, imports...)
40+
41+
var out bytes.Buffer
42+
43+
cmd := exec.Command("go", get...)
44+
cmd.Stdout = &out
45+
cmd.Stderr = &out
46+
47+
if err := cmd.Run(); err != nil {
48+
fmt.Println(err)
49+
}
50+
51+
if out.Len() > 0 {
52+
fmt.Println(out.String())
53+
}
54+
}

imports.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package main
2+
3+
import (
4+
_ "github.com/clipperhouse/gen/typewriters/container"
5+
_ "github.com/clipperhouse/gen/typewriters/genwriter"
6+
)

main.go

Lines changed: 0 additions & 19 deletions
This file was deleted.

pkg.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package main
2+
3+
var stdImports = []string{
4+
`_ "github.com/clipperhouse/gen/typewriters/container"`,
5+
`_ "github.com/clipperhouse/gen/typewriters/genwriter"`,
6+
}
7+
8+
type pkg struct {
9+
Name string
10+
Imports []string
11+
Main bool
12+
}

run.go

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package main
2+
3+
import (
4+
"bytes"
5+
"fmt"
6+
"io"
7+
"os"
8+
"os/exec"
9+
"path/filepath"
10+
"strings"
11+
12+
"github.com/clipperhouse/gen/typewriter"
13+
)
14+
15+
func run() {
16+
if src, err := os.Open("_gen.go"); err == nil {
17+
// custom imports file exists, use it
18+
runCustom(src)
19+
} else {
20+
// do it the regular way
21+
runStandard()
22+
}
23+
}
24+
25+
func runStandard() {
26+
app, err := typewriter.NewApp("+gen")
27+
28+
if err != nil {
29+
panic(err)
30+
}
31+
32+
if err := app.WriteAll(); err != nil {
33+
panic(err)
34+
}
35+
}
36+
37+
func runCustom(src *os.File) {
38+
defer src.Close()
39+
40+
temp, err := getTempDir()
41+
if err != nil {
42+
// TODO return err?
43+
fmt.Println(err)
44+
return
45+
}
46+
defer os.RemoveAll(temp)
47+
48+
// set up imports file containing the custom typewriters (from _gen.go)
49+
imports, err := os.Create(filepath.Join(temp, "imports.go"))
50+
if err != nil {
51+
fmt.Println(err)
52+
return
53+
}
54+
defer imports.Close()
55+
56+
io.Copy(imports, src)
57+
58+
// set up main to be run
59+
main, err := os.Create(filepath.Join(temp, "main.go"))
60+
if err != nil {
61+
fmt.Println(err)
62+
return
63+
}
64+
defer main.Close()
65+
66+
p := pkg{
67+
Name: "main",
68+
Imports: []string{
69+
`"github.com/clipperhouse/gen/typewriter"`,
70+
},
71+
Main: true,
72+
}
73+
tmpl.Execute(main, p)
74+
75+
var out bytes.Buffer
76+
77+
cmd := exec.Command("go", "run", main.Name(), imports.Name())
78+
cmd.Dir = temp
79+
cmd.Stdout = &out
80+
cmd.Stderr = &out
81+
82+
if err = cmd.Run(); err != nil {
83+
fmt.Println(err)
84+
}
85+
86+
if out.Len() > 0 {
87+
fmt.Println(out.String())
88+
}
89+
90+
if strings.Contains(out.String(), "cannot find package") {
91+
fmt.Println("try running `go get` for individual imports in _gen.go")
92+
}
93+
}

write.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package main
2+
3+
import (
4+
"io"
5+
"io/ioutil"
6+
"os"
7+
"path/filepath"
8+
"text/template"
9+
)
10+
11+
// set up temp directory under current directory
12+
// make sure to defer os.RemoveAll() in caller
13+
func getTempDir() (string, error) {
14+
caller := filepath.Base(os.Args[0])
15+
wd, _ := os.Getwd()
16+
return ioutil.TempDir(wd, caller)
17+
}
18+
19+
func write(w io.Writer, p pkg) {
20+
tmpl.Execute(w, p)
21+
}
22+
23+
var tmpl = template.Must(template.New("package").Parse(`package {{.Name}}
24+
{{if gt (len .Imports) 0}}
25+
import ({{range .Imports}}
26+
{{.}}{{end}}
27+
)
28+
{{end}}
29+
{{if .Main}}
30+
func main() {
31+
app, err := typewriter.NewApp("+gen")
32+
33+
if err != nil {
34+
panic(err)
35+
}
36+
37+
if err := app.WriteAll(); err != nil {
38+
panic(err)
39+
}
40+
}
41+
{{end}}
42+
`))

0 commit comments

Comments
 (0)