// Copyright 2015 go-swagger maintainers // // 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 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package strfmt import ( "database/sql/driver" "fmt" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/bsontype" bsonprim "go.mongodb.org/mongo-driver/bson/primitive" ) func init() { var id ObjectId // register this format in the default registry Default.Add("bsonobjectid", &id, IsBSONObjectID) } // IsBSONObjectID returns true when the string is a valid BSON.ObjectId func IsBSONObjectID(str string) bool { _, err := bsonprim.ObjectIDFromHex(str) return err == nil } // ObjectId represents a BSON object ID (alias to go.mongodb.org/mongo-driver/bson/primitive.ObjectID) // // swagger:strfmt bsonobjectid type ObjectId bsonprim.ObjectID //nolint:revive // NewObjectId creates a ObjectId from a Hex String func NewObjectId(hex string) ObjectId { //nolint:revive oid, err := bsonprim.ObjectIDFromHex(hex) if err != nil { panic(err) } return ObjectId(oid) } // MarshalText turns this instance into text func (id ObjectId) MarshalText() ([]byte, error) { oid := bsonprim.ObjectID(id) if oid == bsonprim.NilObjectID { return nil, nil } return []byte(oid.Hex()), nil } // UnmarshalText hydrates this instance from text func (id *ObjectId) UnmarshalText(data []byte) error { // validation is performed later on if len(data) == 0 { *id = ObjectId(bsonprim.NilObjectID) return nil } oidstr := string(data) oid, err := bsonprim.ObjectIDFromHex(oidstr) if err != nil { return err } *id = ObjectId(oid) return nil } // Scan read a value from a database driver func (id *ObjectId) Scan(raw interface{}) error { var data []byte switch v := raw.(type) { case []byte: data = v case string: data = []byte(v) default: return fmt.Errorf("cannot sql.Scan() strfmt.URI from: %#v", v) } return id.UnmarshalText(data) } // Value converts a value to a database driver value func (id ObjectId) Value() (driver.Value, error) { return driver.Value(bsonprim.ObjectID(id).Hex()), nil } func (id ObjectId) String() string { return bsonprim.ObjectID(id).Hex() } // MarshalJSON returns the ObjectId as JSON func (id ObjectId) MarshalJSON() ([]byte, error) { return bsonprim.ObjectID(id).MarshalJSON() } // UnmarshalJSON sets the ObjectId from JSON func (id *ObjectId) UnmarshalJSON(data []byte) error { var obj bsonprim.ObjectID if err := obj.UnmarshalJSON(data); err != nil { return err } *id = ObjectId(obj) return nil } // MarshalBSON renders the object id as a BSON document func (id ObjectId) MarshalBSON() ([]byte, error) { return bson.Marshal(bson.M{"data": bsonprim.ObjectID(id)}) } // UnmarshalBSON reads the objectId from a BSON document func (id *ObjectId) UnmarshalBSON(data []byte) error { var obj struct { Data bsonprim.ObjectID } if err := bson.Unmarshal(data, &obj); err != nil { return err } *id = ObjectId(obj.Data) return nil } // MarshalBSONValue is an interface implemented by types that can marshal themselves // into a BSON document represented as bytes. The bytes returned must be a valid // BSON document if the error is nil. func (id ObjectId) MarshalBSONValue() (bsontype.Type, []byte, error) { oid := bsonprim.ObjectID(id) return bsontype.ObjectID, oid[:], nil } // UnmarshalBSONValue is an interface implemented by types that can unmarshal a // BSON value representation of themselves. The BSON bytes and type can be // assumed to be valid. UnmarshalBSONValue must copy the BSON value bytes if it // wishes to retain the data after returning. func (id *ObjectId) UnmarshalBSONValue(_ bsontype.Type, data []byte) error { var oid bsonprim.ObjectID copy(oid[:], data) *id = ObjectId(oid) return nil } // DeepCopyInto copies the receiver and writes its value into out. func (id *ObjectId) DeepCopyInto(out *ObjectId) { *out = *id } // DeepCopy copies the receiver into a new ObjectId. func (id *ObjectId) DeepCopy() *ObjectId { if id == nil { return nil } out := new(ObjectId) id.DeepCopyInto(out) return out }