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