public bool TryParseElement(BsonDocument parent, out BsonElement element)
        {
            element = default;
            if (!TryGetByte(out var type))
            {
                return(false);
            }
            if (!TryGetCString(out var name))
            {
                return(false);
            }
            switch (type)
            {
            case 1:
            {
                if (!TryGetDouble(out var doubleVal))
                {
                    return(false);
                }
                element = BsonElement.Create(parent, name, doubleVal);
                return(true);
            }

            case 2:
            {
                if (!TryGetString(out var stringValue))
                {
                    return(false);
                }
                element = BsonElement.Create(parent, name, stringValue);
                return(true);
            }

            case 3:
            {
                if (!TryParseDocument(parent, out var docValue))
                {
                    return(false);
                }
                element = BsonElement.Create(parent, name, docValue);
                return(true);
            }

            case 4:
            {
                if (!TryGetArray(out var arrayDoc))
                {
                    return(false);
                }
                element = BsonElement.CreateArray(parent, name, arrayDoc);
                return(true);
            }

            case 5:
            {
                if (!TryGetBinaryData(out var binary))
                {
                    return(false);
                }
                element = BsonElement.Create(parent, name, binary);
                return(true);
            }

            case 7:
            {
                if (!TryGetObjectId(out var objectId))
                {
                    return(false);
                }
                element = BsonElement.Create(parent, name, objectId);
                return(true);
            }

            case 8:
            {
                if (!TryGetBoolean(out var boolValue))
                {
                    return(false);
                }
                element = BsonElement.Create(parent, name, boolValue);
                return(true);
            }

            case 9:
            {
                if (!TryGetUtcDatetime(out var datetime))
                {
                    return(false);
                }
                element = BsonElement.Create(parent, name, datetime);
                return(true);
            }

            case 10:
            {
                element = BsonElement.Create(parent, name);
                return(true);
            }

            case 16:
            {
                if (!TryGetInt32(out var intValue))
                {
                    return(false);
                }
                element = BsonElement.Create(parent, name, intValue);
                return(true);
            }

            case 17:
            {
                if (!TryGetInt64(out var timestampValue))
                {
                    return(false);
                }
                element = BsonElement.Create(parent, name, new BsonTimestamp(timestampValue));
                return(true);
            }

            case 18:
            {
                if (!TryGetInt64(out var longValue))
                {
                    return(false);
                }
                element = BsonElement.Create(parent, name, longValue);
                return(true);
            }

            default:
            {
                return(ThrowHelper.UnknownTypeException <bool>(type));
            }
            }
        }