/*
* Created by Andrey Cherkashin (acherkashin)
* http://acherkashin.me
*
* License
* Copyright (c) 2015 Andrey Cherkashin
* The project released under the MIT license: http://opensource.org/licenses/MIT
*/
package ragefist.core.util;
import com.juniform.JUniformObject;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.logging.Logger;
import org.luaj.vm2.LuaTable;
import org.luaj.vm2.LuaValue;
/**
*
* @author acherkashin
*/
public class FormatTools
{
// ---------------------------------------------------------------------- //
// Lua => JUniformObject
// ---------------------------------------------------------------------- //
public static JUniformObject fromLuaToJUniformObject(LuaValue luaValue) {
return new JUniformObject(_fromLuaToJUniformObject(luaValue));
}
private static Object _fromLuaToJUniformObject(LuaValue luaValue) {
if (luaValue.isboolean()) return luaValue.toboolean();
if (luaValue.islong()) return luaValue.tolong();
if (luaValue.isnil()) return null;
if (luaValue.isstring()) return luaValue.tojstring();
if (luaValue.isnumber()) return luaValue.tonumber();
if (luaValue.istable()) {
Map<Object,JUniformObject> map = new HashMap<>();
LuaTable table = (LuaTable)luaValue;
for(LuaValue key : table.keys()) {
LuaValue value = table.get(key);
map.put(_fromLuaToJUniformObject(key), new JUniformObject(_fromLuaToJUniformObject(value)));
}
return map;
}
Logger.getLogger(FormatTools.class.getName()).warning("Failed to convert undefined type from Lua to JSON: " + luaValue.typename());
return null;
}
// ---------------------------------------------------------------------- //
// JUniformObject => Lua
// ---------------------------------------------------------------------- //
public static LuaValue fromJUniformObjectToLuaValue(JUniformObject object) {
return _fromJUniformObjectToLuaValue(object);
}
private static LuaValue _fromJUniformObjectToLuaValue(JUniformObject object) {
Object innerObject = object.getValue();
if (innerObject == null) {
return LuaValue.NIL;
}
if (innerObject instanceof Integer) {
return LuaValue.valueOf((Integer)innerObject);
} else if (innerObject instanceof Long) {
return LuaValue.valueOf((int)Math.max(Math.min(Integer.MAX_VALUE, (Long)innerObject), Integer.MIN_VALUE));
} else if (innerObject instanceof String) {
return LuaValue.valueOf((String)innerObject);
} else if (innerObject instanceof Double) {
return LuaValue.valueOf((Double)innerObject);
} else if (innerObject instanceof Boolean) {
return LuaValue.valueOf((Boolean)innerObject);
}
else if (object.isMapValue()) {
LuaTable lua = new LuaTable();
Iterator<Map.Entry<Object,JUniformObject>> it = object.entrySet().iterator();
while(it.hasNext()) {
Map.Entry<Object,JUniformObject> entry = it.next();
lua.set(_fromJUniformObjectToLuaValue(new JUniformObject(entry.getKey())), _fromJUniformObjectToLuaValue(entry.getValue()));
}
return lua;
}
else if (object.isArrayValue()) {
LuaTable lua = new LuaTable();
int i = 1;
Iterator<JUniformObject> it = object.iterator();
while(it.hasNext()) {
lua.set(LuaValue.valueOf(i++), _fromJUniformObjectToLuaValue(it.next()));
}
return lua;
}
Logger.getLogger(FormatTools.class.getName()).warning("Failed to convert undefined type from Lua to JSON: " + object.getClass().getName());
return null;
}
}