Skip to content

Commit de1269a

Browse files
authored
Merge pull request #19 from kefniark/feature/diagram
Implement Basic ERD Diagram generation
2 parents 95f6389 + d5b05c4 commit de1269a

17 files changed

Lines changed: 2596 additions & 218 deletions

File tree

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
package codegen
2+
3+
import (
4+
"bufio"
5+
"bytes"
6+
"errors"
7+
"fmt"
8+
"go/format"
9+
"os"
10+
"path"
11+
"path/filepath"
12+
"slices"
13+
14+
"github.com/kefniark/mango-sql/cmd/mangosql/input"
15+
"github.com/kefniark/mango-sql/internal"
16+
"github.com/kefniark/mango-sql/internal/generator"
17+
"github.com/urfave/cli/v2"
18+
)
19+
20+
func Action(ctx *cli.Context) error {
21+
if ctx.NArg() <= 0 {
22+
return errors.New("missing source folder")
23+
}
24+
25+
allowedDrivers := []string{"pq", "pgx", "sqlite", "mysql", "mariadb"}
26+
driver := ctx.String("driver")
27+
if !slices.Contains(allowedDrivers, driver) {
28+
return fmt.Errorf("unknown driver, should be one of %v", allowedDrivers)
29+
}
30+
31+
allowedLoggers := []string{"none", "zap", "logrus", "zerolog", "console"}
32+
logger := ctx.String("logger")
33+
if !slices.Contains(allowedLoggers, logger) {
34+
return fmt.Errorf("unknown logger, should be one of %v", allowedLoggers)
35+
}
36+
37+
name := ctx.Args().Get(0)
38+
return generate(generateOptions{
39+
Src: name,
40+
Output: ctx.String("output"),
41+
Inline: ctx.Bool("inline"),
42+
Package: ctx.String("package"),
43+
Driver: driver,
44+
Logger: logger,
45+
})
46+
}
47+
48+
type generateOptions struct {
49+
Src string
50+
Output string
51+
Inline bool
52+
Package string
53+
Driver string
54+
Logger string
55+
}
56+
57+
func generate(opts generateOptions) error {
58+
// find schema
59+
sql, err := input.ParseInputSchema(opts.Src)
60+
if err != nil {
61+
return err
62+
}
63+
64+
// parse schema
65+
schema, err := internal.ParseSchema(sql)
66+
if err != nil {
67+
return err
68+
}
69+
70+
// find and parse queries
71+
if queries, err := input.ParseInputQueries(opts.Src); err == nil {
72+
err = internal.ParseQueries(schema, queries)
73+
if err != nil {
74+
return err
75+
}
76+
}
77+
78+
var b bytes.Buffer
79+
contents := bufio.NewWriter(&b)
80+
81+
if err = generator.Generate(schema, contents, opts.Package, opts.Driver, opts.Logger); err != nil {
82+
return err
83+
}
84+
85+
folder := path.Dir(opts.Output)
86+
file := path.Base(opts.Output)
87+
88+
stat, err := os.Stat(opts.Output)
89+
if err == nil && stat.IsDir() {
90+
folder = opts.Output
91+
file = "client.go"
92+
}
93+
94+
if err = os.MkdirAll(folder, os.ModeAppend); err != nil {
95+
return err
96+
}
97+
98+
contents.Flush()
99+
formatted, err := format.Source([]byte((b.String())))
100+
if err != nil {
101+
return err
102+
}
103+
104+
if opts.Inline {
105+
return nil
106+
}
107+
108+
f, err := os.Create(path.Join(folder, file))
109+
if err != nil {
110+
return err
111+
}
112+
113+
defer f.Close()
114+
115+
_, err = f.Write(formatted)
116+
if path, err := filepath.Abs(path.Join(folder, file)); err == nil {
117+
fmt.Printf("Generated %s\n", path)
118+
}
119+
120+
return err
121+
}

0 commit comments

Comments
 (0)