/* Copyright 2010-present MongoDB Inc. * * 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. */ using System; using MongoDB.Bson.IO; namespace MongoDB.Bson.Serialization { /// /// Represents all the contextual information needed by a serializer to serialize a value. /// public class BsonSerializationContext { // private fields private readonly Func _isDynamicType; private readonly IBsonWriter _writer; // constructors private BsonSerializationContext( IBsonWriter writer, Func isDynamicType) { _writer = writer; _isDynamicType = isDynamicType; } // public properties /// /// Gets a function that, when executed, will indicate whether the type /// is a dynamic type. /// public Func IsDynamicType { get { return _isDynamicType; } } /// /// Gets the writer. /// /// /// The writer. /// public IBsonWriter Writer { get { return _writer; } } // public static methods /// /// Creates a root context. /// /// The writer. /// The serialization context configurator. /// /// A root context. /// public static BsonSerializationContext CreateRoot( IBsonWriter writer, Action configurator = null) { var builder = new Builder(null, writer); if (configurator != null) { configurator(builder); } return builder.Build(); } /// /// Creates a new context with some values changed. /// /// The serialization context configurator. /// /// A new context. /// public BsonSerializationContext With( Action configurator = null) { var builder = new Builder(this, _writer); if (configurator != null) { configurator(builder); } return builder.Build(); } // nested classes /// /// Represents a builder for a BsonSerializationContext. /// public class Builder { // private fields private Func _isDynamicType; private IBsonWriter _writer; // constructors internal Builder(BsonSerializationContext other, IBsonWriter writer) { if (writer == null) { throw new ArgumentNullException("writer"); } _writer = writer; if (other != null) { _isDynamicType = other._isDynamicType; } else { _isDynamicType = t => (BsonDefaults.DynamicArraySerializer != null && t == BsonDefaults.DynamicArraySerializer.ValueType) || (BsonDefaults.DynamicDocumentSerializer != null && t == BsonDefaults.DynamicDocumentSerializer.ValueType); } } // properties /// /// Gets or sets the function used to determine if a type is a dynamic type. /// public Func IsDynamicType { get { return _isDynamicType; } set { _isDynamicType = value; } } /// /// Gets the writer. /// /// /// The writer. /// public IBsonWriter Writer { get { return _writer; } } // public methods /// /// Builds the BsonSerializationContext instance. /// /// A BsonSerializationContext. internal BsonSerializationContext Build() { return new BsonSerializationContext(_writer, _isDynamicType); } } } }