/// <summary> /// Parses a JSON Pointer from a string. /// </summary> /// <param name="source">The source string.</param> /// <param name="relativePointer">The resulting relative pointer.</param> /// <returns><code>true</code> if the parse was successful; <code>false</code> otherwise.</returns> /// <exception cref="ArgumentNullException"><paramref name="source"/> is null.</exception> public static bool TryParse(string source, out RelativeJsonPointer relativePointer) { if (source == null) { throw new ArgumentNullException(nameof(source)); } if (string.IsNullOrWhiteSpace(source)) { relativePointer = default; return(false); } var span = source.AsSpan(); int i = 0; while (i < span.Length && char.IsDigit(span[i])) { i++; } if (i == 0) { relativePointer = default; return(false); } var number = uint.Parse(span.Slice(0, i).ToString()); if (i == span.Length) { relativePointer = new RelativeJsonPointer(number, JsonPointer.Empty); return(true); } if (span[i] == '#') { if (i + 1 < span.Length) { relativePointer = default; return(false); } relativePointer = new RelativeJsonPointer(number); return(true); } if (span[i] != '/') { relativePointer = default; return(false); } if (!JsonPointer.TryParse(span.Slice(i).ToString(), out var pointer)) { relativePointer = default; return(false); } relativePointer = new RelativeJsonPointer(number, pointer); return(true); }
/// <summary> /// Parses a JSON Pointer from a string. /// </summary> /// <param name="source">The source string.</param> /// <param name="relativePointer">The resulting relative pointer.</param> /// <returns><code>true</code> if the parse was successful; <code>false</code> otherwise.</returns> /// <exception cref="ArgumentNullException"><paramref name="source"/> is null.</exception> public static bool TryParse(string source, out RelativeJsonPointer relativePointer) { if (source == null) { throw new ArgumentNullException(nameof(source)); } if (string.IsNullOrWhiteSpace(source)) { relativePointer = default; return(false); } var span = source.AsSpan(); int i = 0; while (i < span.Length && char.IsDigit(span[i])) { i++; } if (i == 0) { relativePointer = default; return(false); } var parentSteps = uint.Parse(span.Slice(0, i).ToString()); if (i == span.Length) { relativePointer = new RelativeJsonPointer(parentSteps, JsonPointer.Empty); return(true); } int indexManipulation = 0; if (span[i] == '+' || span[i] == '-') { var sign = span[i] == '+' ? 1 : -1; i++; var start = i; while (i < span.Length && char.IsDigit(span[i])) { i++; } indexManipulation = sign * int.Parse(span.Slice(start, i - start).ToString()); if (i == span.Length) { relativePointer = new RelativeJsonPointer(parentSteps, indexManipulation, JsonPointer.Empty); return(true); } } if (span[i] == '#') { if (i + 1 < span.Length) { relativePointer = default; return(false); } relativePointer = new RelativeJsonPointer(parentSteps, indexManipulation); return(true); } if (span[i] != '/') { relativePointer = default; return(false); } if (!JsonPointer.TryParse(span.Slice(i).ToString(), out var pointer)) { relativePointer = default; return(false); } relativePointer = new RelativeJsonPointer(parentSteps, indexManipulation, pointer); return(true); }