// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

namespace System.ComponentModel.Design.Serialization;

/// <summary>
///  The ComponentSerializationService supports "absolute" serialization,
///  where instead of just serializing values that differ from an object's
///  default values, all values are serialized in such a way as to be able
///  to reset values to their defaults for objects that may have already
///  been initialized. When a component serialization service wishes to
///  indicate this to CodeDomSerializer objects, it will place a
///  SerializeAbsoluteContext on the context stack. The member in this
///  context may be null, to indicate that all members are serialized, or
///  a member indicating that only a specific member is being serialized at
///  this time.
/// </summary>
public sealed class SerializeAbsoluteContext
{
    /// <summary>
    ///  Creates a new SerializeAbsoluteContext. Member can be null or
    ///  omitted to indicate this context should be used for all members.
    /// </summary>
    public SerializeAbsoluteContext()
    {
    }

    /// <summary>
    ///  Creates a new SerializeAbsoluteContext. Member can be null or
    ///  omitted to indicate this context should be used for all members.
    /// </summary>
    public SerializeAbsoluteContext(MemberDescriptor? member)
    {
        Member = member;
    }

    /// <summary>
    ///  This property returns the member this context is bound to.
    ///  It may be null to indicate the context is bound to all members of an object.
    /// </summary>
    public MemberDescriptor? Member { get; }

    /// <summary>
    ///  Returns true if the given member should be serialized in this context.
    /// </summary>
    public bool ShouldSerialize(MemberDescriptor? member)
    {
        return Member is null || Member == member;
    }
}
