ffi: fix support for generated calls with generic types (for Java FFI)
[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 standard
20 private import json_parser
21 private import json_lexer
22
23 redef class Nvalue
24 fun to_nit_object: nullable Object is abstract
25 end
26
27 redef class Nvalue_number
28 redef fun to_nit_object
29 do
30 var text = n_number.text
31 if text.chars.has('.') or text.chars.has('e') or text.chars.has('E') then return text.to_f
32 return text.to_i
33 end
34 end
35
36 redef class Nvalue_string
37 redef fun to_nit_object do return n_string.to_nit_string
38 end
39
40 redef class Nvalue_true
41 redef fun to_nit_object do return true
42 end
43
44 redef class Nvalue_false
45 redef fun to_nit_object do return false
46 end
47
48 redef class Nvalue_null
49 redef fun to_nit_object do return null
50 end
51
52 redef class Nstring
53 # FIXME support \n, etc.
54 fun to_nit_string: String do return text.substring(1, text.length-2).
55 replace("\\\\", "\\").replace("\\\"", "\"").replace("\\b", "\b").
56 replace("\\/", "/").replace("\\n", "\n").replace("\\r", "\r").
57 replace("\\t", "\t")
58 end
59
60 redef class Nvalue_object
61 redef fun to_nit_object
62 do
63 var obj = new HashMap[String, nullable Object]
64 var members = n_members
65 if members != null then
66 var pairs = members.pairs
67 for pair in pairs do obj[pair.name] = pair.value
68 end
69 return obj
70 end
71 end
72
73 redef class Nmembers
74 fun pairs: Array[Npair] is abstract
75 end
76
77 redef class Nmembers_tail
78 redef fun pairs
79 do
80 var arr = n_members.pairs
81 arr.add n_pair
82 return arr
83 end
84 end
85
86 redef class Nmembers_head
87 redef fun pairs do return [n_pair]
88 end
89
90 redef class Npair
91 fun name: String do return n_string.to_nit_string
92 fun value: nullable Object do return n_value.to_nit_object
93 end
94
95 redef class Nvalue_array
96 redef fun to_nit_object
97 do
98 var arr = new Array[nullable Object]
99 var elements = n_elements
100 if elements != null then
101 var items = elements.items
102 for item in items do arr.add(item.to_nit_object)
103 end
104 return arr
105 end
106 end
107
108 redef class Nelements
109 fun items: Array[Nvalue] is abstract
110 end
111
112 redef class Nelements_tail
113 redef fun items
114 do
115 var items = n_elements.items
116 items.add(n_value)
117 return items
118 end
119 end
120
121 redef class Nelements_head
122 redef fun items do return [n_value]
123 end
124
125 redef class String
126 fun json_to_nit_object: nullable Object
127 do
128 var lexer = new Lexer_json(self)
129 var parser = new Parser_json
130 var tokens = lexer.lex
131 parser.tokens.add_all(tokens)
132 var root_node = parser.parse
133 if root_node isa NStart then
134 return root_node.n_0.to_nit_object
135 else
136 assert root_node isa NLexerError
137 var pos = root_node.position
138 print "Json parsing error: {root_node.message} at {pos or else "<unknown>"} for {root_node}"
139 return null
140 end
141 end
142 end