This commit is contained in:
2022-05-10 00:08:45 -05:00
parent 770fe65f98
commit bb8c34e0cd
74 changed files with 2025 additions and 1556 deletions

View File

@ -5,118 +5,148 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
public abstract class Container {
public abstract class Container
{
abstract boolean accepts(String key);
abstract void put(String key, Object value);
abstract Object get(String key);
abstract boolean isImplicit();
abstract boolean accepts(String key);
static class Table extends Container {
private final Map<String, Object> values = new HashMap<String, Object>();
final String name;
final boolean implicit;
abstract void put(String key, Object value);
Table() {
this(null, false);
}
public Table(String name) {
this(name, false);
}
abstract Object get(String key);
public Table(String tableName, boolean implicit) {
this.name = tableName;
this.implicit = implicit;
}
abstract boolean isImplicit();
@Override
boolean accepts(String key) {
return !values.containsKey(key) || values.get(key) instanceof TableArray;
}
static class Table extends Container
{
private final Map<String, Object> values = new HashMap<String, Object>();
final String name;
final boolean implicit;
@Override
void put(String key, Object value) {
values.put(key, value);
}
@Override
Object get(String key) {
return values.get(key);
}
boolean isImplicit() {
return implicit;
}
/**
* This modifies the Table's internal data structure, such that it is no longer usable.
*
* 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) {
entry.setValue(((Table) entry.getValue()).consume());
} else if (entry.getValue() instanceof TableArray) {
entry.setValue(((TableArray) entry.getValue()).getValues());
Table()
{
this(null, false);
}
}
return values;
public Table(String name)
{
this(name, false);
}
public Table(String tableName, boolean implicit)
{
this.name = tableName;
this.implicit = implicit;
}
@Override
boolean accepts(String key)
{
return !values.containsKey(key) || values.get(key) instanceof TableArray;
}
@Override
void put(String key, Object value)
{
values.put(key, value);
}
@Override
Object get(String key)
{
return values.get(key);
}
boolean isImplicit()
{
return implicit;
}
/**
* 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)
{
entry.setValue(((Table)entry.getValue()).consume());
}
else if (entry.getValue() instanceof TableArray)
{
entry.setValue(((TableArray)entry.getValue()).getValues());
}
}
return values;
}
@Override
public String toString()
{
return values.toString();
}
}
@Override
public String toString() {
return values.toString();
}
}
static class TableArray extends Container
{
private final List<Table> values = new ArrayList<Table>();
static class TableArray extends Container {
private final List<Table> values = new ArrayList<Table>();
TableArray()
{
values.add(new Table());
}
TableArray() {
values.add(new Table());
@Override
boolean accepts(String key)
{
return getCurrent().accepts(key);
}
@Override
void put(String key, Object value)
{
values.add((Table)value);
}
@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;
}
Table getCurrent()
{
return values.get(values.size() - 1);
}
@Override
public String toString()
{
return values.toString();
}
}
@Override
boolean accepts(String key) {
return getCurrent().accepts(key);
private Container()
{
}
@Override
void put(String key, Object value) {
values.add((Table) value);
}
@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;
}
Table getCurrent() {
return values.get(values.size() - 1);
}
@Override
public String toString() {
return values.toString();
}
}
private Container() {}
}