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); }
internal static GreenJsonMultiValueSyntax CreateMultiValue(GreenJsonValueSyntax valueContentNode) { return(new GreenJsonMultiValueSyntax( new SingleElementEnumerable <GreenJsonValueWithBackgroundSyntax>(new GreenJsonValueWithBackgroundSyntax( GreenJsonBackgroundListSyntax.Empty, valueContentNode)), GreenJsonBackgroundListSyntax.Empty)); }
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))); } } }
/// <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)); }
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); }
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); }
internal abstract Union <ITypeErrorBuilder, PValue> TryCreateValue( string json, GreenJsonValueSyntax valueNode, out T convertedValue, int valueNodeStartPosition, List <JsonErrorInfo> errors);
public override Maybe <PString> DefaultVisit(GreenJsonValueSyntax node, _void arg) => Maybe <PString> .Nothing;