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

109 lines
3.1 KiB
Java
Raw Normal View History

package dev.plex.toml;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
2022-05-10 05:08:45 +00:00
public class ArrayValueReader implements ValueReader
{
2022-05-10 05:08:45 +00:00
public static final ArrayValueReader ARRAY_VALUE_READER = new ArrayValueReader();
2022-05-10 05:08:45 +00:00
@Override
public boolean canRead(String s)
{
return s.startsWith("[");
}
@Override
public Object read(String s, AtomicInteger index, dev.plex.toml.Context context)
{
AtomicInteger line = context.line;
int startLine = line.get();
int startIndex = index.get();
List<Object> arrayItems = new ArrayList<Object>();
boolean terminated = false;
boolean inComment = false;
dev.plex.toml.Results.Errors errors = new dev.plex.toml.Results.Errors();
for (int i = index.incrementAndGet(); i < s.length(); i = index.incrementAndGet())
{
2022-05-10 05:08:45 +00:00
char c = s.charAt(i);
if (c == '#' && !inComment)
{
inComment = true;
}
else if (c == '\n')
{
inComment = false;
line.incrementAndGet();
}
else if (inComment || Character.isWhitespace(c) || c == ',')
{
continue;
}
else if (c == '[')
{
Object converted = read(s, index, context);
if (converted instanceof dev.plex.toml.Results.Errors)
{
2022-05-19 18:59:16 +00:00
errors.add((dev.plex.toml.Results.Errors) converted);
2022-05-10 05:08:45 +00:00
}
else if (!isHomogenousArray(converted, arrayItems))
{
errors.heterogenous(context.identifier.getName(), line.get());
}
else
{
arrayItems.add(converted);
}
continue;
}
else if (c == ']')
{
terminated = true;
break;
}
else
{
Object converted = ValueReaders.VALUE_READERS.convert(s, index, context);
if (converted instanceof dev.plex.toml.Results.Errors)
{
2022-05-19 18:59:16 +00:00
errors.add((dev.plex.toml.Results.Errors) converted);
2022-05-10 05:08:45 +00:00
}
else if (!isHomogenousArray(converted, arrayItems))
{
errors.heterogenous(context.identifier.getName(), line.get());
}
else
{
arrayItems.add(converted);
}
}
}
2022-05-10 05:08:45 +00:00
if (!terminated)
{
errors.unterminated(context.identifier.getName(), s.substring(startIndex), startLine);
}
2022-05-10 05:08:45 +00:00
if (errors.hasErrors())
{
return errors;
}
return arrayItems;
}
2022-05-10 05:08:45 +00:00
private boolean isHomogenousArray(Object o, List<?> values)
{
return values.isEmpty() || values.get(0).getClass().isAssignableFrom(o.getClass()) || o.getClass().isAssignableFrom(values.get(0).getClass());
}
2022-05-10 05:08:45 +00:00
private ArrayValueReader()
{
}
}