Beispiel #1
0
            internal static bool TryCreateItemValue <ItemT>(
                PType <ItemT> itemType,
                string json,
                GreenJsonListSyntax jsonListSyntax,
                int itemIndex,
                int listSyntaxStartPosition,
                List <JsonErrorInfo> errors,
                out ItemT convertedTargetValue,
                out PValue value)
            {
                GreenJsonValueSyntax itemNode = jsonListSyntax.ListItemNodes[itemIndex].ValueNode.ContentNode;

                int itemNodeStart = listSyntaxStartPosition
                                    + jsonListSyntax.GetElementNodeStart(itemIndex)
                                    + jsonListSyntax.ListItemNodes[itemIndex].ValueNode.BackgroundBefore.Length;

                var itemValueOrError = itemType.TryCreateValue(
                    json,
                    itemNode,
                    out convertedTargetValue,
                    itemNodeStart,
                    errors);

                if (itemValueOrError.IsOption2(out value))
                {
                    return(true);
                }

                // Report type error at this index.
                itemValueOrError.IsOption1(out ITypeErrorBuilder itemTypeError);
                errors.Add(ValueTypeErrorAtItemIndex.Create(itemTypeError, itemIndex, itemNode, json, itemNodeStart));
                return(false);
            }
Beispiel #2
0
 internal static GreenJsonMultiValueSyntax CreateMultiValue(GreenJsonValueSyntax valueContentNode)
 {
     return(new GreenJsonMultiValueSyntax(
                new SingleElementEnumerable <GreenJsonValueWithBackgroundSyntax>(new GreenJsonValueWithBackgroundSyntax(
                                                                                     GreenJsonBackgroundListSyntax.Empty,
                                                                                     valueContentNode)),
                GreenJsonBackgroundListSyntax.Empty));
 }
Beispiel #3
0
 internal override Union <ITypeErrorBuilder, PValue> TryCreateValue(
     string json,
     GreenJsonValueSyntax valueNode,
     out TValue convertedValue,
     int valueNodeStartPosition,
     List <JsonErrorInfo> errors)
 => converter.Visit(valueNode).IsJust(out convertedValue)
     ? convertedValue
     : Union <ITypeErrorBuilder, PValue> .Option1(typeError);
        /// <summary>
        /// Gets the display string for a json value.
        /// </summary>
        /// <param name="valueNode">
        /// The value node.
        /// </param>
        /// <param name="json">
        /// The source json on which the <paramref name="valueNode"/> is based.
        /// </param>
        /// <param name="valueNodeStart">
        /// The start position of the value node in the source json.
        /// </param>
        /// <returns>
        /// The display string.
        /// </returns>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="valueNode"/> and/or <paramref name="json"/> are null.
        /// </exception>
        public static string GetValueDisplayString(GreenJsonValueSyntax valueNode, string json, int valueNodeStart)
        {
            if (valueNode == null)
            {
                throw new ArgumentNullException(nameof(valueNode));
            }
            if (json == null)
            {
                throw new ArgumentNullException(nameof(json));
            }

            const int    maxLength      = 31;
            const string ellipsis       = "...";
            const int    ellipsisLength = 3;
            const int    halfLength     = (maxLength - ellipsisLength) / 2;

            switch (valueNode)
            {
            case GreenJsonMissingValueSyntax _:
                // Missing values.
                return(null);

            case GreenJsonStringLiteralSyntax _:
                // 2 quote characters.
                if (valueNode.Length <= maxLength)
                {
                    // QuoteStringValue not necessary, already quoted.
                    return(json.Substring(valueNodeStart, valueNode.Length));
                }
                else
                {
                    // Remove quotes, add ellipsis to inner string value, then quote again.
                    return(QuoteStringValue(
                               json.Substring(valueNodeStart + 1, halfLength - 1)
                               + ellipsis
                               + json.Substring(valueNodeStart + valueNode.Length - halfLength + 1, halfLength - 1)));
                }

            default:
                if (valueNode.Length <= maxLength)
                {
                    return(QuoteValue(json.Substring(valueNodeStart, valueNode.Length)));
                }
                else
                {
                    return(QuoteValue(
                               json.Substring(valueNodeStart, halfLength)
                               + ellipsis
                               + json.Substring(valueNodeStart + valueNode.Length - halfLength, halfLength)));
                }
            }
        }
Beispiel #5
0
        /// <summary>
        /// Initializes a new instance of <see cref="ValueTypeError"/>.
        /// </summary>
        /// <param name="typeErrorBuilder">
        /// The context insensitive information for this error message.
        /// </param>
        /// <param name="valueNode">
        /// The value node corresponding to the value that was typechecked.
        /// </param>
        /// <param name="json">
        /// The source json which contains the type error.
        /// </param>
        /// <param name="valueNodeStart">
        /// The start position of the value node in the source json.
        /// </param>
        /// <returns>
        /// A <see cref="ValueTypeError"/> instance which generates a localized error message.
        /// </returns>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="typeErrorBuilder"/> and/or <paramref name="valueNode"/> and/or <paramref name="json"/> are null.
        /// </exception>
        public static ValueTypeError Create(ITypeErrorBuilder typeErrorBuilder, GreenJsonValueSyntax valueNode, string json, int valueNodeStart)
        {
            if (typeErrorBuilder == null)
            {
                throw new ArgumentNullException(nameof(typeErrorBuilder));
            }

            return(new ValueTypeError(
                       typeErrorBuilder,
                       PTypeErrorBuilder.GetValueDisplayString(valueNode, json, valueNodeStart),
                       valueNodeStart,
                       valueNode.Length));
        }
Beispiel #6
0
            internal sealed override Union <ITypeErrorBuilder, PValue> TryCreateValue(
                string json,
                GreenJsonValueSyntax valueNode,
                out T convertedValue,
                int valueNodeStartPosition,
                List <JsonErrorInfo> errors)
            {
                if (valueNode is GreenJsonMapSyntax jsonMapSyntax)
                {
                    return(TryCreateFromMap(json, jsonMapSyntax, out convertedValue, valueNodeStartPosition, errors));
                }

                convertedValue = default;
                return(MapTypeError);
            }
Beispiel #7
0
            internal sealed override Union <ITypeErrorBuilder, PValue> TryCreateValue(
                string json,
                GreenJsonValueSyntax valueNode,
                out T convertedValue,
                int valueNodeStartPosition,
                List <JsonErrorInfo> errors)
            {
                if (valueNode is GreenJsonListSyntax jsonListSyntax)
                {
                    return(TryCreateFromList(json, jsonListSyntax, out convertedValue, valueNodeStartPosition, errors).Match(
                               whenOption1: error => Union <ITypeErrorBuilder, PValue> .Option1(error),
                               whenOption2: list => list));
                }

                convertedValue = default;
                return(ListTypeError);
            }
Beispiel #8
0
 internal abstract Union <ITypeErrorBuilder, PValue> TryCreateValue(
     string json,
     GreenJsonValueSyntax valueNode,
     out T convertedValue,
     int valueNodeStartPosition,
     List <JsonErrorInfo> errors);
Beispiel #9
0
 public override Maybe <PString> DefaultVisit(GreenJsonValueSyntax node, _void arg) => Maybe <PString> .Nothing;