/*
 * Arduino JSON library
 * Benoit Blanchon 2014 - MIT License
 */

#pragma once

#include "JsonToken.h"

#ifndef ARDUINO_JSON_NO_DEPRECATION_WARNING
#ifdef __GNUC__
#define DEPRECATED __attribute__((deprecated))
#elif defined(_MSC_VER)
#define DEPRECATED __declspec(deprecated)
#endif
#else
#define DEPRECATED
#endif

namespace ArduinoJson
{
    namespace Parser
    {
        // A JSON value
        // Can be converted to string, double, bool, array or object.
        class JsonValue : protected JsonToken
        {
        public:

            // Create a invalid value
            JsonValue()
            {
            }

            // Convert a JsonToken to a JsonValue
            JsonValue(JsonToken token)
                : JsonToken(token)
            {
            }

            // Tell is the JsonValue is valid
            bool success()
            {
                return isValid();
            }

            // Convert the JsonValue to a bool.
            // Returns false if the JsonValue is not a primitve.
            operator bool();

            // Convert the JsonValue to a floating point value.
            // Returns false if the JsonValue is not a number.
            operator double();

            // Convert the JsonValue to a long integer.
            // Returns 0 if the JsonValue is not a number.
            operator long();

            // Convert the JsonValue to a string.
            // Returns 0 if the JsonValue is not a string.
            operator char*();            
            
            // Get the nested value at the specified index.            
            // Returns an invalid JsonValue if the current value is not an array.
            JsonValue operator[](int index);

            // Get the nested value matching the specified index.            
            // Returns an invalid JsonValue if the current value is not an object.
            JsonValue operator[](const char* key);
        };
    }
}