diff src/luan/modules/parsers/LuanToString.java @ 1189:73d754b1889f

add stringify
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 23 Feb 2018 01:40:04 -0700
parents src/luan/lib/json/JsonToString.java@b70102bab110
children db7d31f4089a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/modules/parsers/LuanToString.java	Fri Feb 23 01:40:04 2018 -0700
@@ -0,0 +1,100 @@
+package luan.modules.parsers;
+
+import java.util.List;
+import java.util.Map;
+import luan.Luan;
+import luan.LuanTable;
+import luan.LuanException;
+
+
+public final class LuanToString {
+
+	public static String toString(Object obj,boolean strict) throws LuanException {
+		StringBuilder sb = new StringBuilder();
+		new LuanToString(strict).toString(obj,sb,0);
+		return sb.toString();
+	}
+
+	private final boolean strict;
+
+	private LuanToString(boolean strict) {
+		this.strict = strict;
+	}
+
+	private void toString(Object obj,StringBuilder sb,int indented) throws LuanException {
+		if( obj == null ) {
+			sb.append( "nil" );
+			return;
+		}
+		if( obj instanceof Boolean ) {
+			sb.append( obj );
+			return;
+		}
+		if( obj instanceof Number ) {
+			sb.append( Luan.toString((Number)obj) );
+			return;
+		}
+		if( obj instanceof String ) {
+			toString((String)obj,sb);
+			return;
+		}
+		if( obj instanceof LuanTable ) {
+			toString((LuanTable)obj,sb,indented);
+			return;
+		}
+		if( strict )
+			throw new LuanException("can't handle type "+obj.getClass().getName());
+		sb.append( '<' );
+		sb.append( obj );
+		sb.append( '>' );
+	}
+
+	private void toString(final String s,StringBuilder sb) {
+		sb.append( '"' );
+		sb.append( Luan.stringEncode(s) );
+		sb.append( '"' );
+	}
+
+	private void toString(LuanTable tbl,StringBuilder sb,int indented) throws LuanException {
+		List list = tbl.asList();
+		Map map = tbl.rawMap();
+		sb.append( '{' );
+		if( !list.isEmpty() ) {
+			indent(sb,indented+1);
+			for( Object obj : list ) {
+				toString(obj,sb,indented+1);
+				sb.append( ", " );
+			}
+		}
+		for( Object obj : map.entrySet() ) {
+			Map.Entry entry = (Map.Entry)obj;
+			indent(sb,indented+1);
+			toString(entry,sb,indented+1);
+		}
+		if( !list.isEmpty() || !map.isEmpty() )
+			indent(sb,indented);
+		sb.append( '}' );
+		return;
+	}
+
+	private void toString(Map.Entry entry,StringBuilder sb,int indented) throws LuanException {
+		Object key = entry.getKey();
+		if( key instanceof String && ((String)key).matches("[a-zA-Z_][a-zA-Z_0-9]*") ) {
+			sb.append( (String)key );
+		} else {
+			sb.append( '[' );
+			toString( key, sb, indented );
+			sb.append( ']' );
+		}
+		sb.append( " = " );
+		toString( entry.getValue(), sb, indented );
+	}
+
+	private void indent(StringBuilder sb,int indented) {
+		sb.append( '\n' );
+		for( int i=0; i<indented; i++ ) {
+			sb.append( '\t' );
+		}
+	}
+
+}