aboutsummaryrefslogtreecommitdiff
path: root/tests/sort_json.lua
blob: c95ab3c4f64b7d53fe64d63319d385987b6a9ef9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
-- NOTE: This will only work for simple tests. It doesn't parse strings so if
-- you put any symbols like {?[], inside of a string literal then it will break
-- The point of this function is to test basic structures, and not test JSON
-- strings

local function sort_callback(str)
  local inside = str:sub(2, -2)

  local parts = {}
  local buffer = ""
  local pos = 1

  while true do
    if pos > #inside then
      break
    end

    local append

    local parens = inside:match("^%b{}", pos)
    if parens then
      pos = pos + #parens
      append = sort_callback(parens)
    else
      local array = inside:match("^%b[]", pos)
      if array then
        pos = pos + #array
        append = array
      else
        local front = inside:sub(pos, pos)
        pos = pos + 1

        if front == "," then
          table.insert(parts, buffer)
          buffer = ""
        else
          append = front
        end
      end
    end

    if append then
      buffer = buffer .. append
    end
  end

  if buffer ~= "" then
    table.insert(parts, buffer)
  end

  table.sort(parts)

  return "{" .. table.concat(parts, ",") .. "}"
end

local function sort_json(str)
  return (str:gsub("%b{}", sort_callback))
end


return sort_json