Exemplo n.º 1
0
 /// <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);
Exemplo n.º 2
0
 private RelativeJsonPointer(uint parentSteps, JsonPointer pointer)
 {
     IsIndexQuery = false;
     ParentSteps  = parentSteps;
     Pointer      = pointer;
 }
Exemplo n.º 3
0
 private RelativeJsonPointer(uint parentSteps)
 {
     IsIndexQuery = true;
     ParentSteps  = parentSteps;
     Pointer      = JsonPointer.Empty;
 }
Exemplo n.º 4
0
        /// <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);
        }
Exemplo n.º 5
0
        /// <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));
        }
Exemplo n.º 6
0
 /// <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);