/// <summary>
        /// Creates a new parameter <see cref="OasFieldExpression"/>.
        /// </summary>
        /// <param name="expressionType">
        ///     The expression type. This must be <see cref="OasFieldExpressionType.Request"/> or <see cref="OasFieldExpressionType.Response"/>.
        /// </param>
        /// <param name="pointer">
        ///     The JSON pointer.
        /// </param>
        public OasFieldExpression(OasFieldExpressionType expressionType, JsonPointer pointer)
        {
            switch (expressionType)
            {
            case OasFieldExpressionType.Request:
            case OasFieldExpressionType.Response:
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(expressionType));
            }

            ExpressionType   = expressionType;
            ExpressionSource = OasFieldExpressionSource.Body;
            Name             = null;
            Pointer          = pointer;
        }
        /// <summary>
        /// Creates a new simple <see cref="OasFieldExpression"/>.
        /// </summary>
        /// <param name="expressionType">
        ///     The expression type. This must be <see cref="OasFieldExpressionType.Url"/>, <see cref="OasFieldExpressionType.Method"/>
        ///     or <see cref="OasFieldExpressionType.StatusCode"/>.
        /// </param>
        public OasFieldExpression(OasFieldExpressionType expressionType)
        {
            switch (expressionType)
            {
            case OasFieldExpressionType.Url:
            case OasFieldExpressionType.Method:
            case OasFieldExpressionType.StatusCode:
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(expressionType));
            }

            ExpressionType   = expressionType;
            ExpressionSource = OasFieldExpressionSource.None;
            Name             = null;
            Pointer          = default;
        }
        /// <summary>
        /// Creates a new parameter <see cref="OasFieldExpression"/>.
        /// </summary>
        /// <param name="expressionType">
        ///     The expression type. This must be <see cref="OasFieldExpressionType.Request"/> or <see cref="OasFieldExpressionType.Response"/>.
        /// </param>
        /// <param name="expressionSource">
        ///     The expression source. This must be <see cref="OasFieldExpressionSource.Header"/>, <see cref="OasFieldExpressionSource.Query"/>
        ///     or <see cref="OasFieldExpressionSource.Path"/>.
        /// </param>
        /// <param name="name">
        ///     The name being referred to.
        /// </param>
        public OasFieldExpression(OasFieldExpressionType expressionType, OasFieldExpressionSource expressionSource, string name)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentNullException(nameof(name));
            }

            switch (expressionType)
            {
            case OasFieldExpressionType.Request:
            case OasFieldExpressionType.Response:
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(expressionType));
            }

            switch (expressionSource)
            {
            case OasFieldExpressionSource.Header:
                ValidateToken(name);
                break;

            case OasFieldExpressionSource.Query:
            case OasFieldExpressionSource.Path:
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(expressionSource));
            }

            ExpressionType   = expressionType;
            ExpressionSource = expressionSource;
            Name             = name;
            Pointer          = default;
        }