| // Copyright (C) MongoDB, Inc. 2017-present. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); you may |
| // not use this file except in compliance with the License. You may obtain |
| // a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 |
| |
| package command |
| |
| import ( |
| "github.com/mongodb/mongo-go-driver/bson" |
| "github.com/mongodb/mongo-go-driver/x/bsonx" |
| "github.com/mongodb/mongo-go-driver/x/network/wiremessage" |
| ) |
| |
| func decodeCommandOpMsg(msg wiremessage.Msg) (bson.Raw, error) { |
| var mainDoc bsonx.Doc |
| |
| for _, section := range msg.Sections { |
| switch converted := section.(type) { |
| case wiremessage.SectionBody: |
| err := mainDoc.UnmarshalBSON(converted.Document) |
| if err != nil { |
| return nil, err |
| } |
| case wiremessage.SectionDocumentSequence: |
| arr := bsonx.Arr{} |
| for _, doc := range converted.Documents { |
| newDoc := bsonx.Doc{} |
| err := newDoc.UnmarshalBSON(doc) |
| if err != nil { |
| return nil, err |
| } |
| |
| arr = append(arr, bsonx.Document(newDoc)) |
| } |
| |
| mainDoc = append(mainDoc, bsonx.Elem{converted.Identifier, bsonx.Array(arr)}) |
| } |
| } |
| |
| byteArray, err := mainDoc.MarshalBSON() |
| if err != nil { |
| return nil, err |
| } |
| |
| rdr := bson.Raw(byteArray) |
| err = rdr.Validate() |
| if err != nil { |
| return nil, NewCommandResponseError("malformed OP_MSG: invalid document", err) |
| } |
| |
| err = extractError(rdr) |
| if err != nil { |
| return nil, err |
| } |
| return rdr, nil |
| } |