]> granicus.if.org Git - icinga2/commitdiff
Implement the Json.encode and Json.decode methods
authorGunnar Beutner <gunnar@beutner.name>
Mon, 9 Feb 2015 07:12:42 +0000 (08:12 +0100)
committerGunnar Beutner <gunnar@beutner.name>
Mon, 9 Feb 2015 07:14:06 +0000 (08:14 +0100)
fixes #8393

doc/16-library-reference.md
lib/base/CMakeLists.txt
lib/base/json-script.cpp [new file with mode: 0644]
lib/config/config_parser.yy
lib/config/configitembuilder.cpp

index f14829f05de157350fb56522b5d397fc255a5d28..2130eab07c7e7d858ca0209a9bf7df00afaa5ec0 100644 (file)
@@ -223,6 +223,26 @@ Signature:
 
 Returns the tangent of `x`.
 
+## <a id="json-object"></a> Json object
+
+The global `Json` object can be used to encode and decode JSON.
+
+### <a id="json-encode"></a> Json.encode
+
+Signature:
+
+    function encode(x);
+
+Encodes an arbitrary value into JSON.
+
+### <a id="json-decode"></a> Json.decode
+
+Signature:
+
+    function decode(x);
+
+Decodes a JSON string.
+
 ## <a id="number-type"></a> Number type
 
 ### <a id="number-to_string"></a> Number#to_string
index e992febafb35e1b31477888c658c670f977e5fd1..ed60d2aa77848e31f7d2755d5de201f8fbefcaef 100644 (file)
@@ -25,7 +25,7 @@ mkclass_target(sysloglogger.ti sysloglogger.thpp)
 set(base_SOURCES
   application.cpp application-version.cpp application.thpp array.cpp array-script.cpp boolean.cpp boolean-script.cpp console.cpp context.cpp
   convert.cpp debuginfo.cpp dictionary.cpp dictionary-script.cpp dynamicobject.cpp dynamicobject.thpp dynamictype.cpp
-  exception.cpp fifo.cpp filelogger.cpp filelogger.thpp initialize.cpp json.cpp logger.cpp logger.thpp math-script.cpp
+  exception.cpp fifo.cpp filelogger.cpp filelogger.thpp initialize.cpp json.cpp json-script.cpp logger.cpp logger.thpp math-script.cpp
   netstring.cpp networkstream.cpp number.cpp number-script.cpp object.cpp object-script.cpp primitivetype.cpp process.cpp
   ringbuffer.cpp scriptframe.cpp function.cpp function-script.cpp functionwrapper.cpp scriptglobal.cpp
   scriptutils.cpp serializer.cpp socket.cpp stacktrace.cpp
diff --git a/lib/base/json-script.cpp b/lib/base/json-script.cpp
new file mode 100644 (file)
index 0000000..50e5fa7
--- /dev/null
@@ -0,0 +1,46 @@
+/******************************************************************************
+ * Icinga 2                                                                   *
+ * Copyright (C) 2012-2015 Icinga Development Team (http://www.icinga.org)    *
+ *                                                                            *
+ * This program is free software; you can redistribute it and/or              *
+ * modify it under the terms of the GNU General Public License                *
+ * as published by the Free Software Foundation; either version 2             *
+ * of the License, or (at your option) any later version.                     *
+ *                                                                            *
+ * This program is distributed in the hope that it will be useful,            *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
+ * GNU General Public License for more details.                               *
+ *                                                                            *
+ * You should have received a copy of the GNU General Public License          *
+ * along with this program; if not, write to the Free Software Foundation     *
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.             *
+ ******************************************************************************/
+
+#include "base/dictionary.hpp"
+#include "base/function.hpp"
+#include "base/functionwrapper.hpp"
+#include "base/scriptframe.hpp"
+#include "base/initialize.hpp"
+#include "base/json.hpp"
+
+using namespace icinga;
+
+static String JsonEncodeShim(const Value& value)
+{
+       return JsonEncode(value);
+}
+
+static void InitializeJsonObj(void)
+{
+       Dictionary::Ptr jsonObj = new Dictionary();
+
+       /* Methods */
+       jsonObj->Set("encode", new Function(WrapFunction(JsonEncodeShim)));
+       jsonObj->Set("decode", new Function(WrapFunction(JsonDecode)));
+
+       ScriptGlobal::Set("Json", jsonObj);
+}
+
+INITIALIZE_ONCE(InitializeJsonObj);
+
index 357bf40fcefe3e29eb65f74ca97b8a43fc605b6d..7b17164b8ed05eaee8349ac533ed23b6f7fb6207 100644 (file)
@@ -449,7 +449,7 @@ object:
                context->m_Assign.push(NULL);
                context->m_Ignore.push(NULL);
        }
-       object_declaration identifier rterm use_specifier rterm_scope_require_side_effect
+       object_declaration identifier optional_rterm use_specifier rterm_scope_require_side_effect
        {
                context->m_ObjectAssign.pop();
 
index 0ebe2b75f6a744e5c065162e18d04b63e46fbab6..542c56aab7e6da7edc77d1dc405252aa893f153f 100644 (file)
@@ -89,12 +89,6 @@ ConfigItem::Ptr ConfigItemBuilder::Compile(void)
                BOOST_THROW_EXCEPTION(std::invalid_argument(msgbuf.str()));
        }
 
-       if (m_Name.IsEmpty()) {
-               std::ostringstream msgbuf;
-               msgbuf << "The name of an object may not be empty: " << m_DebugInfo;
-               BOOST_THROW_EXCEPTION(std::invalid_argument(msgbuf.str()));
-       }
-
        std::vector<Expression *> exprs;
 
        Array::Ptr templateArray = new Array();