/// <summary>
                /// Parses out a JSON AST node with a jsonTextReader.
                /// </summary>
                /// <param name="jsonTextReader">The reader to use as a lexer / tokenizer</param>
                /// <returns>JSON AST node (type determined by the reader)</returns>
                private static JsonTextNode ParseNode(IJsonReader jsonTextReader)
                {
                    JsonTextNode node;

                    switch (jsonTextReader.CurrentTokenType)
                    {
                    case JsonTokenType.BeginArray:
                        node = JsonTextParser.ParseArrayNode(jsonTextReader);
                        break;

                    case JsonTokenType.BeginObject:
                        node = JsonTextParser.ParseObjectNode(jsonTextReader);
                        break;

                    case JsonTokenType.String:
                        node = JsonTextParser.ParseStringNode(jsonTextReader);
                        break;

                    case JsonTokenType.Number:
                        node = JsonTextParser.ParseNumberNode(jsonTextReader);
                        break;

                    case JsonTokenType.Float32:
                    case JsonTokenType.Float64:
                        node = JsonTextParser.ParseFloatNode(jsonTextReader, jsonTextReader.CurrentTokenType);
                        break;

                    case JsonTokenType.Int8:
                    case JsonTokenType.Int16:
                    case JsonTokenType.Int32:
                    case JsonTokenType.Int64:
                    case JsonTokenType.UInt32:
                        node = JsonTextParser.ParseIntegerNode(jsonTextReader, jsonTextReader.CurrentTokenType);
                        break;

                    case JsonTokenType.True:
                        node = JsonTextParser.ParseTrueNode(jsonTextReader);
                        break;

                    case JsonTokenType.False:
                        node = JsonTextParser.ParseFalseNode(jsonTextReader);
                        break;

                    case JsonTokenType.Null:
                        node = JsonTextParser.ParseNullNode(jsonTextReader);
                        break;

                    case JsonTokenType.Guid:
                        node = JsonTextParser.ParseGuidNode(jsonTextReader);
                        break;

                    case JsonTokenType.Binary:
                        node = JsonTextParser.ParseBinaryNode(jsonTextReader);
                        break;

                    default:
                        throw new JsonInvalidTokenException();
                    }

                    return(node);
                }