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