107 lines
2.3 KiB
Go
107 lines
2.3 KiB
Go
package fix
|
|
|
|
import (
|
|
"log/slog"
|
|
"time"
|
|
|
|
"quantex.com/qfixdpl/src/common/tracerr"
|
|
)
|
|
|
|
// FixField identifies a single FIX field by its dictionary metadata.
|
|
type FixField struct {
|
|
Name string
|
|
Tag int
|
|
Type string
|
|
}
|
|
|
|
// FieldValue is the typed value for a FIX field.
|
|
type FieldValue interface{}
|
|
|
|
// FieldMap is the enriched representation of a FIX FieldMap (header, body, or trailer).
|
|
type FieldMap map[FixField]FieldValue
|
|
|
|
// GetMap converts a FieldMap into a JSON-friendly map keyed by field name.
|
|
func GetMap(fieldMap FieldMap) map[string]interface{} {
|
|
result := map[string]interface{}{}
|
|
|
|
for f, v := range fieldMap {
|
|
slog.Info("try to parse fieldMap: %+v, value: %+v", f, v)
|
|
k, val := GetKeyValue(f, v)
|
|
result[k] = val
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
//nolint:funlen,gocyclo,cyclop //it's long but easy to read
|
|
func GetKeyValue(f FixField, value FieldValue) (key string, val interface{}) {
|
|
key = f.Name
|
|
|
|
switch f.Type {
|
|
case "NUMINGROUP":
|
|
var groups []map[string]interface{}
|
|
|
|
fMapLst, ok := value.([]FieldMap)
|
|
if !ok {
|
|
err := tracerr.Errorf("could not parse as []FieldMap, value: %+v, key: %s", value, key)
|
|
slog.Error(err.Error())
|
|
}
|
|
|
|
for _, fieldMap := range fMapLst {
|
|
groups = append(groups, GetMap(fieldMap))
|
|
}
|
|
|
|
val = groups
|
|
case "BOOLEAN":
|
|
b, ok := value.(bool)
|
|
if !ok {
|
|
err := tracerr.Errorf("could not parse as bool, value: %+v, key: %s", value, key)
|
|
slog.Error(err.Error())
|
|
}
|
|
|
|
val = b
|
|
case "INT", "LENGTH", "SEQNUM":
|
|
i, ok := value.(int)
|
|
if !ok {
|
|
err := tracerr.Errorf("could not parse as int, value: %+v, key: %s", value, key)
|
|
slog.Error(err.Error())
|
|
}
|
|
|
|
val = i
|
|
case "UTCTIMESTAMP":
|
|
t, ok := value.(time.Time)
|
|
if !ok {
|
|
err := tracerr.Errorf("could not parse as Time, value: %+v, key: %s", value, key)
|
|
slog.Error(err.Error())
|
|
}
|
|
|
|
val = t
|
|
case "STRING":
|
|
s, ok := value.(string)
|
|
if !ok {
|
|
err := tracerr.Errorf("could not parse as string, value: %+v, key: %s", value, key)
|
|
slog.Error(err.Error())
|
|
}
|
|
|
|
val = s
|
|
case "CHAR":
|
|
s, ok := value.(string)
|
|
if !ok {
|
|
err := tracerr.Errorf("could not parse as string, value: %+v, key: %s", value, key)
|
|
slog.Error(err.Error())
|
|
}
|
|
|
|
val = s
|
|
default:
|
|
s, ok := value.(string)
|
|
if !ok {
|
|
err := tracerr.Errorf("could not parse as string, value: %+v, key: %s", value, key)
|
|
slog.Error(err.Error())
|
|
}
|
|
|
|
val = s
|
|
}
|
|
|
|
return key, val
|
|
}
|