// Copyright (C) MongoDB, Inc. 2022-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 mgocompat provides Registry, a BSON registry compatible with globalsign/mgo's BSON,
// with some remaining differences. It also provides RegistryRespectNilValues for compatibility
// with mgo's BSON with RespectNilValues set to true. A registry can be configured on a
// mongo.Client with the SetRegistry option. See the bsoncodec docs for more details on registries.
//
// Registry supports Getter and Setter equivalents by registering hooks. Note that if a value
// matches the hook for bsoncodec.Marshaler, bsoncodec.ValueMarshaler, or bsoncodec.Proxy, that
// hook will take priority over the Getter hook. The same is true for the hooks for
// bsoncodec.Unmarshaler and bsoncodec.ValueUnmarshaler and the Setter hook.
//
// The functional differences between Registry and globalsign/mgo's BSON library are:
//
// 1) Registry errors instead of silently skipping mismatched types when decoding.
//
// 2) Registry does not have special handling for marshaling array ops ("$in", "$nin", "$all").
//
// The driver uses different types than mgo's bson. The differences are:
//
//     1) The driver's bson.RawValue is equivalent to mgo's bson.Raw, but uses Value instead of Data and uses Type,
//        which is a bsontype.Type object that wraps a byte, instead of bson.Raw's Kind, a byte.
//
//     2) The driver uses primitive.ObjectID, which is a [12]byte instead of mgo's
//        bson.ObjectId, a string. Due to this, the zero value marshals and unmarshals differently
//        for Extended JSON, with the driver marshaling as {"ID":"000000000000000000000000"} and
//        mgo as {"Id":""}. The driver can unmarshal {"ID":""} to a primitive.ObjectID.
//
//     3) The driver's primitive.Symbol is equivalent to mgo's bson.Symbol.
//
//     4) The driver uses primitive.Timestamp instead of mgo's bson.MongoTimestamp. While
//        MongoTimestamp is an int64, primitive.Timestamp stores the time and counter as two separate
//        uint32 values, T and I respectively.
//
//     5) The driver uses primitive.MinKey and primitive.MaxKey, which are struct{}, instead
//        of mgo's bson.MinKey and bson.MaxKey, which are int64.
//
//     6) The driver's primitive.Undefined is equivalent to mgo's bson.Undefined.
//
//     7) The driver's primitive.Binary is equivalent to mgo's bson.Binary, with variables named Subtype
//        and Data instead of Kind and Data.
//
//     8) The driver's primitive.Regex is equivalent to mgo's bson.RegEx.
//
//     9) The driver's primitive.JavaScript is equivalent to mgo's bson.JavaScript with no
//         scope and primitive.CodeWithScope is equivalent to mgo's bson.JavaScript with scope.
//
//     10) The driver's primitive.DBPointer is equivalent to mgo's bson.DBPointer, with variables
//         named DB and Pointer instead of Namespace and Id.
//
//     11) When implementing the Setter interface, mgocompat.ErrSetZero is equivalent to mgo's
//         bson.ErrSetZero.
//
package mgocompat
