/// <summary> /// Creates a Relative JSON Pointer from a JSON Pointer and a number of parent steps. /// </summary> /// <param name="parentSteps">The number of parent steps.</param> /// <param name="pointer">The JSON Pointer.</param> /// <returns>A Relative JSON Pointer.</returns> public static RelativeJsonPointer FromPointer(uint parentSteps, JsonPointer pointer) => new RelativeJsonPointer(parentSteps, pointer);
private RelativeJsonPointer(uint parentSteps, JsonPointer pointer) { IsIndexQuery = false; ParentSteps = parentSteps; Pointer = pointer; }
private RelativeJsonPointer(uint parentSteps) { IsIndexQuery = true; ParentSteps = parentSteps; Pointer = JsonPointer.Empty; }
/// <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); }
/// <summary> /// Parses a JSON Pointer segment from a string. /// </summary> /// <param name="source">The source string.</param> /// <returns>A Relative JSON Pointer.</returns> /// <exception cref="ArgumentNullException"><paramref name="source"/> is null.</exception> /// <exception cref="PointerParseException"><paramref name="source"/> does not contain a valid relative pointer.</exception> public static RelativeJsonPointer Parse(string source) { if (source == null) { throw new ArgumentNullException(nameof(source)); } if (string.IsNullOrWhiteSpace(source)) { throw new ArgumentException($"`{nameof(source)}` contains no data"); } var span = source.AsSpan(); int i = 0; while (i < span.Length && char.IsDigit(span[i])) { i++; } if (i == 0) { throw new PointerParseException($"`{nameof(source)}` must start with a non-negative integer"); } var parentSteps = uint.Parse(span.Slice(0, i).ToString()); if (i == span.Length) { return(new RelativeJsonPointer(parentSteps, JsonPointer.Empty)); } 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) { return(new RelativeJsonPointer(parentSteps, indexManipulation, JsonPointer.Empty)); } } if (span[i] == '#') { if (i + 1 < span.Length) { throw new PointerParseException($"{nameof(source)} cannot contain data after a `#`"); } return(new RelativeJsonPointer(parentSteps, indexManipulation)); } if (span[i] != '/') { throw new PointerParseException($"{nameof(source)} must contain either a `#` or a pointer after the initial number"); } var pointer = JsonPointer.Parse(span.Slice(i).ToString()); return(new RelativeJsonPointer(parentSteps, indexManipulation, pointer)); }
/// <summary> /// Creates a Relative JSON Pointer from a JSON Pointer and a number of parent steps. /// </summary> /// <param name="parentSteps">The number of parent steps.</param> /// <param name="arrayIndexManipulator">The index manipulator.</param> /// <param name="pointer">The JSON Pointer.</param> /// <returns>A Relative JSON Pointer.</returns> public static RelativeJsonPointer FromPointer(uint parentSteps, int arrayIndexManipulator, JsonPointer pointer) => new RelativeJsonPointer(parentSteps, arrayIndexManipulator, pointer);