rsjson-lua 0.4.0

a json lua module using the serde-json rust crate
Documentation
local luamark = require("luamark")

local rsjson = require("rsjson")
local dkjson = require("dkjson").use_lpeg()
local cjson = require("cjson").new()
local rapidjson = require("rapidjson")

local encoding_test = {
   one = 1,
   two = "2",
   three = { 4, 5, 6 },
   ["four"] = {
      [1] = "one",
      [2] = "two",
      [3] = "three",
   },
   nested = {
      one = 1,
      two = "2",
      three = { 4, 5, 6 },
      ["four"] = {
         [1] = "one",
         [2] = "two",
         [3] = "three",
      },
      nested = {
         one = 1,
         two = "2",
         three = { 4, 5, 6 },
         ["four"] = {
            [1] = "one",
            [2] = "two",
            [3] = "three",
         },
         nested = {
            one = 1,
            two = "2",
            three = { 4, 5, 6 },
            ["four"] = {
               [1] = "one",
               [2] = "two",
               [3] = "three",
            },
         },
      },
   },
   nested2 = {
      one = 1,
      two = "2",
      three = { 4, 5, 6 },
      ["four"] = {
         [1] = "one",
         [2] = "two",
         [3] = "three",
      },
      nested = {
         one = 1,
         two = "2",
         three = { 4, 5, 6 },
         ["four"] = {
            [1] = "one",
            [2] = "two",
            [3] = "three",
         },
         nested = {
            one = 1,
            two = "2",
            three = { 4, 5, 6 },
            ["four"] = {
               [1] = "one",
               [2] = "two",
               [3] = "three",
            },
            nested = {
               one = 1,
               two = "2",
               three = { 4, 5, 6 },
               ["four"] = {
                  [1] = "one",
                  [2] = "two",
                  [3] = "three",
               },
            },
         },
      },
      nested2 = {
         one = 1,
         two = "2",
         three = { 4, 5, 6 },
         ["four"] = {
            [1] = "one",
            [2] = "two",
            [3] = "three",
         },
         nested = {
            one = 1,
            two = "2",
            three = { 4, 5, 6 },
            ["four"] = {
               [1] = "one",
               [2] = "two",
               [3] = "three",
            },
            nested = {
               one = 1,
               two = "2",
               three = { 4, 5, 6 },
               ["four"] = {
                  [1] = "one",
                  [2] = "two",
                  [3] = "three",
               },
               nested = {
                  one = 1,
                  two = "2",
                  three = { 4, 5, 6 },
                  ["four"] = {
                     [1] = "one",
                     [2] = "two",
                     [3] = "three",
                  },
               },
            },
         },
      },
   },
}

local decoding_test = [[{"three":[4,5,6],"nested":{"three":[4,5,6],"one":1,"nested":{"three":[4,5,6],"one":1,"nested":{"one":1,"three":[4,5,6],"two":"2","four":["one","two","three"]},"two":"2","four":["one","two","three"]},"two":"2","four":["one","two","three"]},"one":1,"nested2":{"three":[4,5,6],"nested":{"three":[4,5,6],"one":1,"nested":{"three":[4,5,6],"one":1,"nested":{"one":1,"three":[4,5,6],"two":"2","four":["one","two","three"]},"two":"2","four":["one","two","three"]},"two":"2","four":["one","two","three"]},"one":1,"nested2":{"three":[4,5,6],"one":1,"nested":{"three":[4,5,6],"one":1,"nested":{"three":[4,5,6],"one":1,"nested":{"one":1,"three":[4,5,6],"two":"2","four":["one","two","three"]},"two":"2","four":["one","two","three"]},"two":"2","four":["one","two","three"]},"two":"2","four":["one","two","three"]},"two":"2","four":["one","two","three"]},"two":"2","four":["one","two","three"]}]]

local iters = arg[1] or 100

local encoding = luamark.compare_time({
   rsjson = function (ctx, p)
      for _ = 1, iters do
         rsjson.encode(encoding_test, ctx.rsjson)
      end
   end,
   dkjson = function (ctx, p)
      for _ = 1, iters do
         dkjson.encode(encoding_test, ctx.dkjson)
      end
   end,
   cjson = function (ctx, p)
      for _ = 1, iters do
         cjson.encode(encoding_test)
      end
   end,
   rapidjson = function (ctx, p)
      for _ = 1, iters do
         rapidjson.encode(encoding_test, ctx.rapidjson)
      end
   end,
},
   {
      params = { pretty = { false, true } },
      setup = function (p)
         local pretty = p.pretty

         local rsjson_config = rsjson.EncodeConfig:new()
         local dkjson_config = { indent = pretty }
         local rapidjson_config = { pretty = pretty }

         if pretty then
            rsjson_config.indent = 4
         end

         return {
            rsjson = rsjson_config,
            dkjson = dkjson_config,
            rapidjson = rapidjson_config,
            cjson = {},
         }
      end,
   })

local decoding = luamark.compare_time({
   rsjson = function ()
      for _ = 1, iters do
         rsjson.decode(decoding_test)
      end
   end,
   dkjson = function ()
      for _ = 1, iters do
         dkjson.decode(decoding_test)
      end
   end,
   cjson = function ()
      for _ = 1, iters do
         cjson.decode(decoding_test)
      end
   end,
   rapidjson = function ()
      for _ = 1, iters do
         rapidjson.decode(decoding_test)
      end
   end,
})

local sep = 20
print(("-"):rep(sep))
print("Encoding (Time): " .. iters .. " iters")
print(("-"):rep(sep))
print(luamark.render(encoding))
print()
print(("-"):rep(sep))
print("Decoding (Time): " .. iters .. " iters")
print(("-"):rep(sep))
print(luamark.render(decoding))