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

using System;

namespace Microsoft.CSharp.RuntimeBinder.ComInterop
{
    /// <summary>
    ///    Strongly-typed and parameterized exception factory.
    /// </summary>
    internal static partial class Error
    {
        /// <summary>
        /// InvalidOperationException with message like "Marshal.SetComObjectData failed."
        /// </summary>
        internal static Exception SetComObjectDataFailed()
        {
            return new InvalidOperationException(SR.COMSetComObjectDataFailed);
        }

        /// <summary>
        /// InvalidOperationException with message like "Unexpected VarEnum {0}."
        /// </summary>
        internal static Exception UnexpectedVarEnum(object p0)
        {
            return new InvalidOperationException(SR.Format(SR.COMUnexpectedVarEnum, p0));
        }

        /// <summary>
        /// System.Reflection.TargetParameterCountException with message like "Error while invoking {0}."
        /// </summary>
        internal static Exception DispBadParamCount(object p0)
        {
            return new System.Reflection.TargetParameterCountException(SR.Format(SR.COMDispatchInvokeError, p0));
        }

        /// <summary>
        /// MissingMemberException with message like "Error while invoking {0}."
        /// </summary>
        internal static Exception DispMemberNotFound(object p0)
        {
            return new MissingMemberException(SR.Format(SR.COMDispatchInvokeError, p0));
        }

        /// <summary>
        /// ArgumentException with message like "Error while invoking {0}. Named arguments are not supported."
        /// </summary>
        internal static Exception DispNoNamedArgs(object p0)
        {
            return new ArgumentException(SR.Format(SR.COMDispatchInvokeErrorNoNamedArgs, p0));
        }

        /// <summary>
        /// OverflowException with message like "Error while invoking {0}."
        /// </summary>
        internal static Exception DispOverflow(object p0)
        {
            return new OverflowException(SR.Format(SR.COMDispatchInvokeError, p0));
        }

        /// <summary>
        /// ArgumentException with message like "Could not convert argument {0} for call to {1}."
        /// </summary>
        internal static Exception DispTypeMismatch(object p0, object p1)
        {
            return new ArgumentException(SR.Format(SR.COMDispatchInvokeErrorTypeMismatch, p0, p1));
        }

        /// <summary>
        /// ArgumentException with message like "Error while invoking {0}. A required parameter was omitted."
        /// </summary>
        internal static Exception DispParamNotOptional(object p0)
        {
            return new ArgumentException(SR.Format(SR.COMDispatchInvokeErrorParamNotOptional, p0));
        }

        /// <summary>
        /// InvalidOperationException with message like "Cannot retrieve type information."
        /// </summary>
        internal static Exception CannotRetrieveTypeInformation()
        {
            return new InvalidOperationException(SR.COMCannotRetrieveTypeInfo);
        }

        /// <summary>
        /// ArgumentException with message like "IDispatch::GetIDsOfNames behaved unexpectedly for {0}."
        /// </summary>
        internal static Exception GetIDsOfNamesInvalid(object p0)
        {
            return new ArgumentException(SR.Format(SR.COMGetIDsOfNamesInvalid, p0));
        }

        /// <summary>
        /// InvalidOperationException with message like "Attempting to pass an event handler of an unsupported type."
        /// </summary>
        internal static Exception UnsupportedHandlerType()
        {
            return new InvalidOperationException(SR.COMUnsupportedEventHandlerType);
        }

        /// <summary>
        /// MissingMemberException with message like "Could not get dispatch ID for {0} (error: {1})."
        /// </summary>
        internal static Exception CouldNotGetDispId(object p0, object p1)
        {
            return new MissingMemberException(SR.Format(SR.COMGetDispatchIdFailed, p0, p1));
        }

        /// <summary>
        /// System.Reflection.AmbiguousMatchException with message like "There are valid conversions from {0} to {1}."
        /// </summary>
        internal static Exception AmbiguousConversion(object p0, object p1)
        {
            return new System.Reflection.AmbiguousMatchException(SR.Format(SR.COMAmbiguousConversion, p0, p1));
        }
    }
}
