-
Notifications
You must be signed in to change notification settings - Fork 0
/
silks.go
88 lines (76 loc) · 2.47 KB
/
silks.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package silks
import (
"go/ast"
"github.com/chuckha/silks/internal/core"
"github.com/chuckha/silks/internal/usecases"
)
type App struct {
adapter Adapter
useCases UseCases
presenter Presenter
}
func NewApp(a Adapter, u UseCases, p Presenter) *App {
return &App{
adapter: a,
useCases: u,
presenter: p,
}
}
func (s *App) GenerateCreateTable(modelFile string) (string, error) {
mf, err := s.adapter.AdaptCreateTable(modelFile)
if err != nil {
return "", err
}
return s.useCases.GenerateCreateTable(mf)
}
func (s *App) AddField(modelFile, model, field, fieldType, colName string) (string, string, error) {
mf, afc, err := s.adapter.AddField(modelFile, model, field, fieldType, colName)
if err != nil {
return "", "", err
}
addStmt, err := s.useCases.AddField(mf, afc)
if err != nil {
return "", "", err
}
tree := mf.ToAST()
updatedModel, err := s.presenter.RewriteModelFile(tree)
return addStmt, updatedModel, err
}
func (s *App) RenameField(modelFile, model, field, toField, toColName string) (string, string, error) {
mf, rfc, err := s.adapter.RenameField(modelFile, model, field, toField, toColName)
if err != nil {
return "", "", err
}
renameStmt, err := s.useCases.RenameField(mf, rfc)
if err != nil {
return "", "", err
}
tree := mf.ToAST()
updatedModel, err := s.presenter.RewriteModelFile(tree)
return renameStmt, updatedModel, err
}
// Adapter takes input from another system and converts it to something a usecase can understand
type Adapter interface {
AdaptCreateTable(modelFile string) (*core.ModelFile, error)
AddField(modelFile, model, field, fieldType, colName string) (*core.ModelFile, *core.AddFieldConfiguration, error)
RenameField(modelFile, model, field, toField, toColName string) (*core.ModelFile, *core.RenameFieldConfiguration, error)
}
// UseCases define the behavior of the usecases
type UseCases interface {
GenerateCreateTable(model *core.ModelFile) (string, error)
AddField(modelFile *core.ModelFile, addcfg *core.AddFieldConfiguration) (string, error)
RenameField(modelFile *core.ModelFile, renameCfg *core.RenameFieldConfiguration) (string, error)
}
// AppUseCases are the actual implementation
type AppUseCases struct {
*usecases.CreateTableGenerator
*usecases.FieldAdder
*usecases.FieldRenamer
}
type GeneratorFactory interface {
Get(dialect string) (SQLSyntaxGenerator, error)
}
// Presenter changes the result of a usecase to something user-friendly
type Presenter interface {
RewriteModelFile(*ast.File) (string, error)
}