From bfa1530af96808042c5a100e2404f52487e7f9be Mon Sep 17 00:00:00 2001 From: Amadeo Casas Date: Sun, 17 Aug 2014 13:24:21 -0700 Subject: [PATCH] Support for structs in document fields --- goes.go | 23 ++++++++++++++++++----- structs.go | 2 +- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/goes.go b/goes.go index fddf4f3..da86b56 100644 --- a/goes.go +++ b/goes.go @@ -13,6 +13,7 @@ import ( "io/ioutil" "net/http" "net/url" + "reflect" "strconv" "strings" ) @@ -139,13 +140,25 @@ func (c *Connection) BulkSend(documents []Document) (Response, error) { bulkData[i] = action i++ - if len(doc.Fields) > 0 { - fields := make(map[string]interface{}, len(doc.Fields)) - for fieldName, fieldValue := range doc.Fields { - fields[fieldName] = fieldValue + if doc.Fields != nil { + if docFields, ok := doc.Fields.(map[string]interface{}); ok { + if len(docFields) == 0 { + continue + } + } else { + typeOfFields := reflect.TypeOf(doc.Fields) + if typeOfFields.Kind() == reflect.Ptr { + typeOfFields = typeOfFields.Elem() + } + if typeOfFields.Kind() != reflect.Struct { + return Response{}, fmt.Errorf("Document fields not in struct or map[string]interface{} format") + } + if typeOfFields.NumField() == 0 { + continue + } } - sources, err := json.Marshal(fields) + sources, err := json.Marshal(doc.Fields) if err != nil { return Response{}, err } diff --git a/structs.go b/structs.go index 05728eb..6ab44ee 100644 --- a/structs.go +++ b/structs.go @@ -102,7 +102,7 @@ type Document struct { Type string Id interface{} BulkCommand string - Fields map[string]interface{} + Fields interface{} } // Represents the "items" field in a _bulk response