Plex/proxy/src/main/java/dev/plex/toml/Container.java

153 lines
3.4 KiB
Java
Raw Normal View History

package dev.plex.toml;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
2022-05-10 05:08:45 +00:00
public abstract class Container
{
2022-05-10 05:08:45 +00:00
abstract boolean accepts(String key);
2022-05-10 05:08:45 +00:00
abstract void put(String key, Object value);
2022-05-10 05:08:45 +00:00
abstract Object get(String key);
2022-05-10 05:08:45 +00:00
abstract boolean isImplicit();
2022-05-10 05:08:45 +00:00
static class Table extends Container
{
private final Map<String, Object> values = new HashMap<String, Object>();
final String name;
final boolean implicit;
2022-05-10 05:08:45 +00:00
Table()
{
this(null, false);
}
2022-05-10 05:08:45 +00:00
public Table(String name)
{
this(name, false);
}
2022-05-10 05:08:45 +00:00
public Table(String tableName, boolean implicit)
{
this.name = tableName;
this.implicit = implicit;
}
2022-05-10 05:08:45 +00:00
@Override
boolean accepts(String key)
{
return !values.containsKey(key) || values.get(key) instanceof TableArray;
}
2022-05-10 05:08:45 +00:00
@Override
void put(String key, Object value)
{
values.put(key, value);
}
2022-05-10 05:08:45 +00:00
@Override
Object get(String key)
{
return values.get(key);
}
2022-05-10 05:08:45 +00:00
boolean isImplicit()
{
return implicit;
}
2022-05-10 05:08:45 +00:00
/**
* This modifies the Table's internal data structure, such that it is no longer usable.
* <p>
* Therefore, this method must only be called when all data has been gathered.
*
* @return A Map-and-List-based of the TOML data
*/
Map<String, Object> consume()
{
for (Map.Entry<String, Object> entry : values.entrySet())
{
if (entry.getValue() instanceof Table)
{
2022-05-19 18:59:16 +00:00
entry.setValue(((Table) entry.getValue()).consume());
2022-05-10 05:08:45 +00:00
}
else if (entry.getValue() instanceof TableArray)
{
2022-05-19 18:59:16 +00:00
entry.setValue(((TableArray) entry.getValue()).getValues());
2022-05-10 05:08:45 +00:00
}
}
return values;
}
2022-05-10 05:08:45 +00:00
@Override
public String toString()
{
return values.toString();
}
}
2022-05-10 05:08:45 +00:00
static class TableArray extends Container
{
private final List<Table> values = new ArrayList<Table>();
2022-05-10 05:08:45 +00:00
TableArray()
{
values.add(new Table());
}
2022-05-10 05:08:45 +00:00
@Override
boolean accepts(String key)
{
return getCurrent().accepts(key);
}
2022-05-10 05:08:45 +00:00
@Override
void put(String key, Object value)
{
2022-05-19 18:59:16 +00:00
values.add((Table) value);
2022-05-10 05:08:45 +00:00
}
@Override
Object get(String key)
{
throw new UnsupportedOperationException();
}
boolean isImplicit()
{
return false;
}
List<Map<String, Object>> getValues()
{
ArrayList<Map<String, Object>> unwrappedValues = new ArrayList<Map<String, Object>>();
for (Table table : values)
{
unwrappedValues.add(table.consume());
}
return unwrappedValues;
}
2022-05-10 05:08:45 +00:00
Table getCurrent()
{
return values.get(values.size() - 1);
}
@Override
public String toString()
{
return values.toString();
}
}
2022-05-10 05:08:45 +00:00
private Container()
{
}
}