lib: intro a simple json reader module using nitcc
[nit.git] / lib / simple_json_reader / simple_json_reader.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16
17 module simple_json_reader
18
19 import json_parser
20 import json_lexer
21
22 redef class Nvalue
23 fun to_nit_object: nullable Object is abstract
24 end
25
26 redef class Nvalue_number
27 redef fun to_nit_object
28 do
29 var text = n_number.text
30 if text.has('.') or text.has('e') or text.has('E') then return text.to_f
31 return text.to_i
32 end
33 end
34
35 redef class Nvalue_string
36 redef fun to_nit_object do return n_string.to_nit_string
37 end
38
39 redef class Nvalue_true
40 redef fun to_nit_object do return true
41 end
42
43 redef class Nvalue_false
44 redef fun to_nit_object do return false
45 end
46
47 redef class Nvalue_null
48 redef fun to_nit_object do return null
49 end
50
51 redef class Nstring
52 # FIXME support \n, etc.
53 fun to_nit_string: String do return text.substring(1, text.length-2)
54 end
55
56 redef class Nvalue_object
57 redef fun to_nit_object
58 do
59 var obj = new HashMap[String, nullable Object]
60 var members = n_members
61 if members != null then
62 var pairs = members.pairs
63 for pair in pairs do obj[pair.name] = pair.value
64 end
65 return obj
66 end
67 end
68
69 redef class Nmembers
70 fun pairs: Array[Npair] is abstract
71 end
72
73 redef class Nmembers_tail
74 redef fun pairs
75 do
76 var arr = n_members.pairs
77 arr.add n_pair
78 return arr
79 end
80 end
81
82 redef class Nmembers_head
83 redef fun pairs do return [n_pair]
84 end
85
86 redef class Npair
87 fun name: String do return n_string.to_nit_string
88 fun value: nullable Object do return n_value.to_nit_object
89 end
90
91 redef class Nvalue_array
92 redef fun to_nit_object
93 do
94 var arr = new Array[nullable Object]
95 var elements = n_elements
96 if elements != null then
97 var items = elements.items
98 for item in items do arr.add(item.to_nit_object)
99 end
100 return arr
101 end
102 end
103
104 redef class Nelements
105 fun items: Array[Nvalue] is abstract
106 end
107
108 redef class Nelements_tail
109 redef fun items
110 do
111 var items = n_elements.items
112 items.add(n_value)
113 return items
114 end
115 end
116
117 redef class Nelements_head
118 redef fun items do return [n_value]
119 end
120
121 redef class String
122 fun json_to_nit_object: nullable Object
123 do
124 var lexer = new Lexer_json(self)
125 var parser = new Parser_json
126 var tokens = lexer.lex
127 parser.tokens.add_all(tokens)
128 var root_node = parser.parse.as(NStart)
129 return root_node.n_0.to_nit_object
130 end
131 end