Mercurial Hosting > luan
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' ); + } + } + +}