I'm trying to write a small replacement for i3status, a small programm that comunicates with i3bar conforming this protocol. They exchange messeages via stdin and stdout.
The stream in both directions is an infinite array of json objects. The start of the stream from i3bar to i3status (which i want to replace) looks like this:
[
{"name": "some_name_1","instance": "some_inst_1","button": 1,"x": 213,"y": 35}
,{"name": "some_name_1","instance": "some_inst_2","button": 2,"x": 687,"y": 354}
,{"name": "some_name_2","instance": "some_inst","button": 1,"x": 786,"y": 637}
,{"name": "some_name_3","instance": "some_inst","button": 3,"x": 768,"y": 67}
...
This is an "array" of objects which represent clicks. The array will never close.
My question is now: What is the right way of parsing this?
Obviously I cannot use the json
library because this is not a vaild json object.
Write a custom reader function (or Decoder) which does a "streaming array parse" like so:
[
then return an error (can't be an array).json.Decoder.Decode
into the "next" item.,
then continue the for-loop in #3.]
then exit the for-loop in #3.