Mercurial Hosting > luan
annotate src/luan/modules/parsers/LuanToString.java @ 1618:a37ffe2d1b14
fix not_found_handler
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 14 Jun 2021 18:45:17 -0600 |
parents | 8852f34a646a |
children | 582384548a69 |
rev | line source |
---|---|
1189 | 1 package luan.modules.parsers; |
720 | 2 |
3 import java.util.List; | |
4 import java.util.Map; | |
1552
46d4baaad64d
add long_string_keys
Franklin Schmidt <fschmidt@gmail.com>
parents:
1550
diff
changeset
|
5 import java.util.Set; |
1553 | 6 import java.util.HashSet; |
1552
46d4baaad64d
add long_string_keys
Franklin Schmidt <fschmidt@gmail.com>
parents:
1550
diff
changeset
|
7 import java.util.Collections; |
1189 | 8 import luan.Luan; |
9 import luan.LuanTable; | |
1607 | 10 import luan.LuanFunction; |
1189 | 11 import luan.LuanException; |
1388
2024d23ddd64
add restore_from_postgres
Franklin Schmidt <fschmidt@gmail.com>
parents:
1190
diff
changeset
|
12 import luan.LuanRuntimeException; |
720 | 13 |
14 | |
1189 | 15 public final class LuanToString { |
1553 | 16 public static class Settings implements Cloneable { |
17 public boolean strict = false; | |
18 public boolean numberTypes = false; | |
19 public boolean compressed = false; | |
20 public boolean longStrings = false; | |
21 public boolean inline = false; | |
22 | |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
23 void applyOptions(LuanTable options) throws LuanException { |
1553 | 24 Boolean b; |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
25 b = (Boolean)options.rawGet("strict"); |
1553 | 26 if( b != null ) |
27 strict = b; | |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
28 b = (Boolean)options.rawGet("number_types"); |
1553 | 29 if( b != null ) |
30 numberTypes = b; | |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
31 b = (Boolean)options.rawGet("compressed"); |
1553 | 32 if( b != null ) |
33 compressed = b; | |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
34 b = (Boolean)options.rawGet("long_strings"); |
1553 | 35 if( b != null ) |
36 longStrings = b; | |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
37 b = (Boolean)options.rawGet("inline"); |
1553 | 38 if( b != null ) |
39 inline = b; | |
40 } | |
41 | |
42 public Settings cloneSettings() { | |
43 try { | |
44 return (Settings)clone(); | |
45 } catch(CloneNotSupportedException e) { | |
46 throw new RuntimeException(e); | |
47 } | |
48 } | |
49 } | |
50 private static final Settings keySettings = new Settings(); | |
51 private static final Set<String> settingsKeys = new HashSet<String>(); | |
52 static { | |
53 Collections.addAll(settingsKeys,"strict","number_types","compressed","long_strings","inline"); | |
54 } | |
55 | |
56 private static void checkOptions(LuanTable options) throws LuanException { | |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
57 for( Map.Entry entry : options.rawIterable() ) { |
1553 | 58 if( !settingsKeys.contains(entry.getKey()) ) |
59 throw new LuanException("invalid option: "+entry.getKey()); | |
60 if( !(entry.getValue() instanceof Boolean) ) | |
61 throw new LuanException("options values must be boolean"); | |
62 } | |
63 } | |
64 | |
65 public final Settings settingsInit = new Settings(); | |
1607 | 66 public Luan luan = null; |
1553 | 67 private final LuanTable subOptions; |
68 | |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
69 public LuanToString(LuanTable options,LuanTable subOptions) throws LuanException { |
1553 | 70 this.subOptions = subOptions; |
71 if( options != null ) { | |
72 checkOptions(options); | |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
73 settingsInit.applyOptions(options); |
1553 | 74 } |
75 if( subOptions != null ) { | |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
76 for( Map.Entry entry : subOptions.rawIterable() ) { |
1553 | 77 /* |
78 if( !(entry.getKey() instanceof String) ) | |
79 throw new LuanException("sub_options keys must be strings"); | |
80 */ | |
81 if( !(entry.getValue() instanceof LuanTable) ) | |
82 throw new LuanException("sub_options keys must be tables"); | |
83 LuanTable tbl = (LuanTable)entry.getValue(); | |
84 checkOptions(tbl); | |
85 } | |
86 } | |
87 } | |
1419
59fd2e8b1b9d
stringify and json_string
Franklin Schmidt <fschmidt@gmail.com>
parents:
1409
diff
changeset
|
88 |
1388
2024d23ddd64
add restore_from_postgres
Franklin Schmidt <fschmidt@gmail.com>
parents:
1190
diff
changeset
|
89 public String toString(Object obj) throws LuanException { |
758
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
720
diff
changeset
|
90 StringBuilder sb = new StringBuilder(); |
1553 | 91 toString(obj,sb,0,settingsInit); |
758
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
720
diff
changeset
|
92 return sb.toString(); |
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
720
diff
changeset
|
93 } |
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
720
diff
changeset
|
94 |
1553 | 95 private void toString(Object obj,StringBuilder sb,int indented,Settings settings) throws LuanException { |
1189 | 96 if( obj == null ) { |
97 sb.append( "nil" ); | |
98 return; | |
99 } | |
100 if( obj instanceof Boolean ) { | |
101 sb.append( obj ); | |
102 return; | |
103 } | |
104 if( obj instanceof Number ) { | |
1553 | 105 toString((Number)obj,sb,settings); |
758
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
720
diff
changeset
|
106 return; |
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
720
diff
changeset
|
107 } |
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
720
diff
changeset
|
108 if( obj instanceof String ) { |
1553 | 109 toString((String)obj,sb,settings); |
758
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
720
diff
changeset
|
110 return; |
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
720
diff
changeset
|
111 } |
1189 | 112 if( obj instanceof LuanTable ) { |
1553 | 113 toString((LuanTable)obj,sb,indented,settings); |
758
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
720
diff
changeset
|
114 return; |
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
720
diff
changeset
|
115 } |
1553 | 116 if( settings.strict ) |
1409 | 117 throw new LuanException("can't handle type "+Luan.type(obj)); |
1189 | 118 sb.append( '<' ); |
119 sb.append( obj ); | |
120 sb.append( '>' ); | |
758
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
720
diff
changeset
|
121 } |
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
720
diff
changeset
|
122 |
1553 | 123 private void toString(LuanTable tbl,StringBuilder sb,int indented,Settings settings) throws LuanException { |
1607 | 124 if( tbl.getMetatable()!=null ) { |
125 if( settings.strict ) | |
126 throw new LuanException("can't handle metatables when strict"); | |
127 if( luan==null ) | |
128 throw new LuanException("can't handle metatables when luan isn't set"); | |
1612 | 129 LuanFunction pairs = luan.getHandlerFunction("__pairs",tbl); |
130 if( pairs != null ) { | |
131 sb.append( '{' ); | |
132 boolean first = true; | |
133 for( Object obj : tbl.iterable(luan) ) { | |
134 Map.Entry entry = (Map.Entry)obj; | |
135 if( settings.compressed ) { | |
136 if( first ) | |
137 first = false; | |
138 else | |
139 sb.append( ',' ); | |
140 } else if( settings.inline ) { | |
141 if( first ) { | |
142 first = false; | |
143 sb.append( ' ' ); | |
144 } else | |
145 sb.append( ", " ); | |
146 } else { | |
1607 | 147 first = false; |
1612 | 148 indent(sb,indented+1); |
149 } | |
150 toString(entry,sb,indented+1,settings); | |
151 } | |
152 if( !first ) { | |
153 if( settings.compressed ) { | |
154 } else if( settings.inline ) { | |
1607 | 155 sb.append( ' ' ); |
1612 | 156 } else { |
157 indent(sb,indented); | |
158 } | |
1607 | 159 } |
1612 | 160 sb.append( '}' ); |
161 return; | |
1607 | 162 } |
163 } | |
1189 | 164 List list = tbl.asList(); |
165 Map map = tbl.rawMap(); | |
166 sb.append( '{' ); | |
1518
f989778ca9e1
stringify, json_string
Franklin Schmidt <fschmidt@gmail.com>
parents:
1485
diff
changeset
|
167 boolean first = true; |
f989778ca9e1
stringify, json_string
Franklin Schmidt <fschmidt@gmail.com>
parents:
1485
diff
changeset
|
168 for( Object obj : list ) { |
1553 | 169 if( settings.compressed ) { |
170 if( first ) | |
171 first = false; | |
172 else | |
173 sb.append( ',' ); | |
174 } else if( settings.inline ) { | |
175 if( first ) { | |
176 first = false; | |
177 sb.append( ' ' ); | |
178 } else | |
179 sb.append( ", " ); | |
180 } else { | |
1419
59fd2e8b1b9d
stringify and json_string
Franklin Schmidt <fschmidt@gmail.com>
parents:
1409
diff
changeset
|
181 indent(sb,indented+1); |
1553 | 182 } |
183 toString(obj,sb,indented+1,settings); | |
758
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
720
diff
changeset
|
184 } |
1189 | 185 for( Object obj : map.entrySet() ) { |
186 Map.Entry entry = (Map.Entry)obj; | |
1553 | 187 if( settings.compressed ) { |
188 if( first ) | |
189 first = false; | |
190 else | |
191 sb.append( ',' ); | |
192 } else if( settings.inline ) { | |
193 if( first ) { | |
194 first = false; | |
195 sb.append( ' ' ); | |
196 } else | |
197 sb.append( ", " ); | |
198 } else { | |
1518
f989778ca9e1
stringify, json_string
Franklin Schmidt <fschmidt@gmail.com>
parents:
1485
diff
changeset
|
199 indent(sb,indented+1); |
1553 | 200 } |
201 toString(entry,sb,indented+1,settings); | |
1189 | 202 } |
1553 | 203 if( !list.isEmpty() || !map.isEmpty() ) { |
204 if( settings.compressed ) { | |
205 } else if( settings.inline ) { | |
206 sb.append( ' ' ); | |
207 } else { | |
208 indent(sb,indented); | |
209 } | |
210 } | |
1189 | 211 sb.append( '}' ); |
1115
809d74db1415
add json_pretty_string
Franklin Schmidt <fschmidt@gmail.com>
parents:
1113
diff
changeset
|
212 return; |
809d74db1415
add json_pretty_string
Franklin Schmidt <fschmidt@gmail.com>
parents:
1113
diff
changeset
|
213 } |
809d74db1415
add json_pretty_string
Franklin Schmidt <fschmidt@gmail.com>
parents:
1113
diff
changeset
|
214 |
1553 | 215 private void toString(Map.Entry entry,StringBuilder sb,int indented,Settings settings) throws LuanException { |
1189 | 216 Object key = entry.getKey(); |
217 if( key instanceof String && ((String)key).matches("[a-zA-Z_][a-zA-Z_0-9]*") ) { | |
218 sb.append( (String)key ); | |
219 } else { | |
220 sb.append( '[' ); | |
1553 | 221 toString( key, sb, indented, keySettings ); |
1189 | 222 sb.append( ']' ); |
1115
809d74db1415
add json_pretty_string
Franklin Schmidt <fschmidt@gmail.com>
parents:
1113
diff
changeset
|
223 } |
1553 | 224 sb.append( settings.compressed ? "=" : " = " ); |
1554 | 225 if( subOptions != null ) { |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
226 LuanTable options = (LuanTable)subOptions.rawGet(key); |
1554 | 227 if( options != null ) { |
228 settings = settings.cloneSettings(); | |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
229 settings.applyOptions(options); |
1554 | 230 } |
1553 | 231 } |
232 toString( entry.getValue(), sb, indented, settings ); | |
1115
809d74db1415
add json_pretty_string
Franklin Schmidt <fschmidt@gmail.com>
parents:
1113
diff
changeset
|
233 } |
809d74db1415
add json_pretty_string
Franklin Schmidt <fschmidt@gmail.com>
parents:
1113
diff
changeset
|
234 |
1189 | 235 private void indent(StringBuilder sb,int indented) { |
236 sb.append( '\n' ); | |
1117
9a1aa6fc0b4e
remove json_pretty_string and make json_string somewhat pretty
Franklin Schmidt <fschmidt@gmail.com>
parents:
1116
diff
changeset
|
237 for( int i=0; i<indented; i++ ) { |
1189 | 238 sb.append( '\t' ); |
1117
9a1aa6fc0b4e
remove json_pretty_string and make json_string somewhat pretty
Franklin Schmidt <fschmidt@gmail.com>
parents:
1116
diff
changeset
|
239 } |
9a1aa6fc0b4e
remove json_pretty_string and make json_string somewhat pretty
Franklin Schmidt <fschmidt@gmail.com>
parents:
1116
diff
changeset
|
240 } |
1115
809d74db1415
add json_pretty_string
Franklin Schmidt <fschmidt@gmail.com>
parents:
1113
diff
changeset
|
241 |
1553 | 242 private void toString(Number n,StringBuilder sb,Settings settings) throws LuanException { |
243 if( settings.numberTypes ) { | |
1388
2024d23ddd64
add restore_from_postgres
Franklin Schmidt <fschmidt@gmail.com>
parents:
1190
diff
changeset
|
244 sb.append( n.getClass().getSimpleName().toLowerCase() ); |
2024d23ddd64
add restore_from_postgres
Franklin Schmidt <fschmidt@gmail.com>
parents:
1190
diff
changeset
|
245 sb.append( '(' ); |
2024d23ddd64
add restore_from_postgres
Franklin Schmidt <fschmidt@gmail.com>
parents:
1190
diff
changeset
|
246 } |
2024d23ddd64
add restore_from_postgres
Franklin Schmidt <fschmidt@gmail.com>
parents:
1190
diff
changeset
|
247 sb.append( Luan.toString(n) ); |
1553 | 248 if( settings.numberTypes ) |
1388
2024d23ddd64
add restore_from_postgres
Franklin Schmidt <fschmidt@gmail.com>
parents:
1190
diff
changeset
|
249 sb.append( ')' ); |
2024d23ddd64
add restore_from_postgres
Franklin Schmidt <fschmidt@gmail.com>
parents:
1190
diff
changeset
|
250 } |
2024d23ddd64
add restore_from_postgres
Franklin Schmidt <fschmidt@gmail.com>
parents:
1190
diff
changeset
|
251 |
1562 | 252 public static void addNumberTypes(Luan luan,LuanTable env) { |
1388
2024d23ddd64
add restore_from_postgres
Franklin Schmidt <fschmidt@gmail.com>
parents:
1190
diff
changeset
|
253 try { |
1562 | 254 LuanTable module = (LuanTable)luan.require("luan:Number.luan"); |
1618
a37ffe2d1b14
fix not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1612
diff
changeset
|
255 env.rawPut( "double", module.fn(luan,"double") ); |
a37ffe2d1b14
fix not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1612
diff
changeset
|
256 env.rawPut( "float", module.fn(luan,"float") ); |
a37ffe2d1b14
fix not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1612
diff
changeset
|
257 env.rawPut( "integer", module.fn(luan,"integer") ); |
a37ffe2d1b14
fix not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1612
diff
changeset
|
258 env.rawPut( "long", module.fn(luan,"long") ); |
1388
2024d23ddd64
add restore_from_postgres
Franklin Schmidt <fschmidt@gmail.com>
parents:
1190
diff
changeset
|
259 } catch(LuanException e) { |
2024d23ddd64
add restore_from_postgres
Franklin Schmidt <fschmidt@gmail.com>
parents:
1190
diff
changeset
|
260 throw new LuanRuntimeException(e); |
2024d23ddd64
add restore_from_postgres
Franklin Schmidt <fschmidt@gmail.com>
parents:
1190
diff
changeset
|
261 } |
2024d23ddd64
add restore_from_postgres
Franklin Schmidt <fschmidt@gmail.com>
parents:
1190
diff
changeset
|
262 } |
1550 | 263 |
1553 | 264 private void toString(String s,StringBuilder sb,Settings settings) { |
265 if( settings.longStrings ) { | |
1552
46d4baaad64d
add long_string_keys
Franklin Schmidt <fschmidt@gmail.com>
parents:
1550
diff
changeset
|
266 StringBuilder start = new StringBuilder("[["); |
46d4baaad64d
add long_string_keys
Franklin Schmidt <fschmidt@gmail.com>
parents:
1550
diff
changeset
|
267 if( s.indexOf('\n') != -1 ) |
46d4baaad64d
add long_string_keys
Franklin Schmidt <fschmidt@gmail.com>
parents:
1550
diff
changeset
|
268 start.append('\n'); |
1550 | 269 StringBuilder end = new StringBuilder("]]"); |
270 while( s.contains(end) ) { | |
271 start.insert(1,'='); | |
272 end.insert(1,'='); | |
273 } | |
274 sb.append(start); | |
275 sb.append(s); | |
276 sb.append(end); | |
277 return; | |
278 } | |
279 sb.append( '"' ); | |
280 sb.append( Luan.stringEncode(s) ); | |
281 sb.append( '"' ); | |
282 } | |
283 | |
720 | 284 } |