Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
113 changes: 41 additions & 72 deletions _gen/generate-components/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import (
var (
pkg string
fixSpec *datadictionary.DataDictionary
imports map[string]bool
)

func usage() {
Expand All @@ -33,26 +32,6 @@ func initPackage() {
}
}

func packageString() (s string) {
s = fmt.Sprintf("package %v\n", pkg)
return
}

func genComponentImports() (fileOut string) {

if len(imports) == 0 {
return
}

fileOut += "import(\n"
for i := range imports {
fileOut += fmt.Sprintf("\"%v\"\n", i)
}
fileOut += ")\n"

return
}

type group struct {
parent string
field *datadictionary.FieldDef
Expand All @@ -74,28 +53,10 @@ func collectGroups(parent string, part datadictionary.MessagePart, groups []grou
return groups
}

func writeFieldDeclaration(part datadictionary.MessagePart, componentName string) string {
switch field := part.(type) {
case datadictionary.Component:
imports[fmt.Sprintf("github.com/quickfixgo/quickfix/%v/%v", pkg, strings.ToLower(field.Name()))] = true
case *datadictionary.FieldDef:
if !field.IsGroup() {
goType := gen.FixFieldTypeToGoType(field.Type)
if goType == "time.Time" {
imports["time"] = true
}
}
}

return gen.WriteFieldDeclaration(fixSpec.Major, fixSpec.Minor, part, componentName)
}

func genGroupDeclaration(field *datadictionary.FieldDef, parent string) (fileOut string) {
fileOut += fmt.Sprintf("//%v is a repeating group in %v\n", field.Name(), parent)
fileOut += fmt.Sprintf("type %v struct {\n", field.Name())
for _, groupField := range field.Parts {
fileOut += writeFieldDeclaration(groupField, field.Name())
}
fileOut += gen.WriteFieldDeclarations(fixSpec.Major, fixSpec.Minor, field.Parts, field.Name())

fileOut += "}\n"

Expand All @@ -116,22 +77,22 @@ func genGroupDeclarations(name string, fields []datadictionary.MessagePart) (fil
}

func genHeader(header *datadictionary.MessageDef) {
imports = make(map[string]bool)

//delay field output to determine imports
delayOut := genGroupDeclarations("Header", header.Parts)
delayOut += fmt.Sprintf("//Header is the %v Header type\n", pkg)
delayOut += "type Header struct {\n"
for _, field := range header.Parts {
delayOut += writeFieldDeclaration(field, "Header")
writer := new(bytes.Buffer)
if err := gen.WritePackage(writer, pkg); err != nil {
panic(err)
}
if err := gen.WriteComponentImports(writer, pkg, header.Parts); err != nil {
panic(err)
}
delayOut += "}\n"

fileOut := packageString()
fileOut += genComponentImports()
fileOut += delayOut
fileOut := writer.String()
fileOut += genGroupDeclarations("Header", header.Parts)
fileOut += fmt.Sprintf("//Header is the %v Header type\n", pkg)
fileOut += "type Header struct {\n"
fileOut += gen.WriteFieldDeclarations(fixSpec.Major, fixSpec.Minor, header.Parts, "Header")
fileOut += "}\n"

writer := new(bytes.Buffer)
writer = new(bytes.Buffer)
if err := gen.WriteFieldSetters(writer, "Header", header.Parts); err != nil {
panic(err)
}
Expand All @@ -141,16 +102,21 @@ func genHeader(header *datadictionary.MessageDef) {
}

func genTrailer(trailer *datadictionary.MessageDef) {
imports = make(map[string]bool)
fileOut := packageString()
writer := new(bytes.Buffer)
if err := gen.WritePackage(writer, pkg); err != nil {
panic(err)
}
if err := gen.WriteComponentImports(writer, pkg, trailer.Parts); err != nil {
panic(err)
}
fileOut := writer.String()

fileOut += fmt.Sprintf("//Trailer is the %v Trailer type\n", pkg)
fileOut += "type Trailer struct {\n"
for _, field := range trailer.Parts {
fileOut += writeFieldDeclaration(field, "Trailer")
}
fileOut += gen.WriteFieldDeclarations(fixSpec.Major, fixSpec.Minor, trailer.Parts, "Trailer")
fileOut += "}\n"

writer := new(bytes.Buffer)
writer = new(bytes.Buffer)
if err := gen.WriteFieldSetters(writer, "Trailer", trailer.Parts); err != nil {
panic(err)
}
Expand All @@ -160,29 +126,32 @@ func genTrailer(trailer *datadictionary.MessageDef) {
}

func genComponent(name string, component *datadictionary.ComponentType) {
imports = make(map[string]bool)

//delay output to determine imports
delayOut := genGroupDeclarations(name, component.Parts)
delayOut += fmt.Sprintf("//%v is a %v Component\n", name, pkg)
delayOut += fmt.Sprintf("type %v struct {\n", name)
for _, field := range component.Parts {
delayOut += writeFieldDeclaration(field, name)
writer := new(bytes.Buffer)
if err := gen.WritePackage(writer, strings.ToLower(name)); err != nil {
panic(err)
}
if err := gen.WriteComponentImports(writer, pkg, component.Parts()); err != nil {
panic(err)
}
delayOut += "}\n"

fileOut := fmt.Sprintf("package %v\n", strings.ToLower(name))
fileOut += genComponentImports()
fileOut += delayOut
if err := gen.WriteNewComponent(writer, *component); err != nil {
panic(err)
}

fileOut := writer.String()
fileOut += genGroupDeclarations(name, component.Parts())
fileOut += fmt.Sprintf("//%v is a %v Component\n", name, pkg)
fileOut += fmt.Sprintf("type %v struct {\n", name)
fileOut += gen.WriteFieldDeclarations(fixSpec.Major, fixSpec.Minor, component.Parts(), name)
fileOut += "}\n"
fileOut += genComponentSetters(component)

gen.WriteFile(path.Join(pkg, strings.ToLower(name), name+".go"), fileOut)
}

func genComponentSetters(component *datadictionary.ComponentType) string {
writer := new(bytes.Buffer)
if err := gen.WriteFieldSetters(writer, component.Name(), component.Parts); err != nil {
if err := gen.WriteFieldSetters(writer, component.Name(), component.Parts()); err != nil {
panic(err)
}

Expand Down
73 changes: 14 additions & 59 deletions _gen/generate-messages/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ var (
pkg string
fixSpec *datadictionary.DataDictionary
sortedMsgTypes []string
imports map[string]bool
)

func usage() {
Expand All @@ -41,43 +40,10 @@ func genMessages() {
}
}

func genMessageImports() string {
fileOut := `
import(
"github.com/quickfixgo/quickfix"
"github.com/quickfixgo/quickfix/enum"
`
fileOut += fmt.Sprintf("\"github.com/quickfixgo/quickfix/%v\"\n", headerTrailerPkg())

for i := range imports {
fileOut += fmt.Sprintf("\"%v\"\n", i)
}
fileOut += ")\n"
return fileOut
}

func writeFieldDeclaration(part datadictionary.MessagePart, componentName string) string {
switch field := part.(type) {
case datadictionary.Component:
imports[fmt.Sprintf("github.com/quickfixgo/quickfix/%v/%v", pkg, strings.ToLower(field.Name()))] = true
case *datadictionary.FieldDef:
if !field.IsGroup() {
goType := gen.FixFieldTypeToGoType(field.Type)
if goType == "time.Time" {
imports["time"] = true
}
}
}

return gen.WriteFieldDeclaration(fixSpec.Major, fixSpec.Minor, part, componentName)
}

func genGroupDeclaration(field *datadictionary.FieldDef, parent string) (fileOut string) {
fileOut += fmt.Sprintf("//%v is a repeating group in %v\n", field.Name(), parent)
fileOut += fmt.Sprintf("type %v struct {\n", field.Name())
for _, groupField := range field.Parts {
fileOut += writeFieldDeclaration(groupField, field.Name())
}
fileOut += gen.WriteFieldDeclarations(fixSpec.Major, fixSpec.Minor, field.Parts, field.Name())

fileOut += "}\n"

Expand Down Expand Up @@ -125,24 +91,13 @@ func genGroupDeclarations(msg *datadictionary.MessageDef) (fileOut string) {
return
}

func headerTrailerPkg() string {
switch pkg {
case "fix50", "fix50sp1", "fix50sp2":
return "fixt11"
}

return pkg
}

func genMessage(msg *datadictionary.MessageDef) string {
fileOut := fmt.Sprintf("//Message is a %v FIX Message\n", msg.Name)
fileOut += "type Message struct {\n"
fileOut += fmt.Sprintf("FIXMsgType string `fix:\"%v\"`\n", msg.MsgType)
fileOut += fmt.Sprintf("%v.Header\n", headerTrailerPkg())
for _, field := range msg.Parts {
fileOut += writeFieldDeclaration(field, msg.Name)
}
fileOut += fmt.Sprintf("%v.Trailer\n", headerTrailerPkg())
fileOut += fmt.Sprintf("%v.Header\n", gen.HeaderTrailerPkg(pkg))
fileOut += gen.WriteFieldDeclarations(fixSpec.Major, fixSpec.Minor, msg.Parts, msg.Name)
fileOut += fmt.Sprintf("%v.Trailer\n", gen.HeaderTrailerPkg(pkg))
fileOut += "}\n"
fileOut += "//Marshal converts Message to a quickfix.Message instance\n"
fileOut += "func (m Message) Marshal() quickfix.Message {return quickfix.Marshal(m)}\n"
Expand Down Expand Up @@ -192,18 +147,18 @@ func Route(router RouteOut) (string,string,quickfix.MessageRoute) {

func genMessagePkg(msg *datadictionary.MessageDef) {
pkgName := strings.ToLower(msg.Name)
imports = make(map[string]bool)

fileOut := fmt.Sprintf("//Package %v msg type = %v.\n", pkgName, msg.MsgType)
fileOut += fmt.Sprintf("package %v\n", pkgName)

//run through group and message declarations to collect required imports first
delayOut := ""
delayOut += genGroupDeclarations(msg)
delayOut += genMessage(msg)

fileOut += genMessageImports()
fileOut += delayOut
writer := new(bytes.Buffer)
if err := gen.WritePackage(writer, pkgName); err != nil {
panic(err)
}
if err := gen.WriteMessageImports(writer, pkg, msg.Parts); err != nil {
panic(err)
}
fileOut += writer.String()
fileOut += genGroupDeclarations(msg)
fileOut += genMessage(msg)
fileOut += genMessageSetters(msg)
fileOut += genMessageRoute(msg)

Expand Down
Loading