Plex/proxy/src/main/java/com/moandjiezana/toml/WriterContext.java

183 lines
4.0 KiB
Java

package com.moandjiezana.toml;
import java.io.File;
import java.io.IOException;
import java.io.Writer;
import java.util.Arrays;
class WriterContext
{
private String arrayKey = null;
private boolean isArrayOfTable = false;
private boolean empty = true;
public final String key;
private final String currentTableIndent;
private final String currentFieldIndent;
private final Writer output;
private final IndentationPolicy indentationPolicy;
private final DatePolicy datePolicy;
public File file;
public String parentName;
public boolean hasRun = false;
WriterContext(IndentationPolicy indentationPolicy, DatePolicy datePolicy, Writer output)
{
this("", "", output, indentationPolicy, datePolicy);
}
WriterContext pushTable(String newKey)
{
String newIndent = "";
if (!key.isEmpty())
{
newIndent = growIndent(indentationPolicy);
}
String fullKey = key.isEmpty() ? newKey : key + "." + newKey;
WriterContext subContext = new WriterContext(fullKey, newIndent, output, indentationPolicy, datePolicy);
if (!empty)
{
subContext.empty = false;
}
return subContext;
}
WriterContext pushTableFromArray()
{
WriterContext subContext = new WriterContext(key, currentTableIndent, output, indentationPolicy, datePolicy);
if (!empty)
{
subContext.empty = false;
}
subContext.setIsArrayOfTable(true);
return subContext;
}
WriterContext write(String s)
{
try
{
output.write(s);
if (empty && !s.isEmpty())
{
empty = false;
}
return this;
} catch (IOException e)
{
throw new RuntimeException(e);
}
}
void write(char[] chars)
{
for (char c : chars)
{
write(c);
}
}
WriterContext write(char c)
{
try
{
output.write(c);
empty = false;
return this;
} catch (IOException e)
{
throw new RuntimeException(e);
}
}
void writeKey()
{
if (key.isEmpty())
{
return;
}
if (!empty)
{
write('\n');
}
write(currentTableIndent);
if (isArrayOfTable)
{
write("[[").write(key).write("]]\n");
} else
{
write('[').write(key).write("]\n");
}
}
void writeArrayDelimiterPadding()
{
for (int i = 0; i < indentationPolicy.getArrayDelimiterPadding(); i++)
{
write(' ');
}
}
void indent()
{
if (!key.isEmpty())
{
write(currentFieldIndent);
}
}
DatePolicy getDatePolicy()
{
return datePolicy;
}
WriterContext setIsArrayOfTable(boolean isArrayOfTable)
{
this.isArrayOfTable = isArrayOfTable;
return this;
}
WriterContext setArrayKey(String arrayKey)
{
this.arrayKey = arrayKey;
return this;
}
String getContextPath()
{
return key.isEmpty() ? arrayKey : key + "." + arrayKey;
}
private String growIndent(IndentationPolicy indentationPolicy)
{
return currentTableIndent + fillStringWithSpaces(indentationPolicy.getTableIndent());
}
private String fillStringWithSpaces(int count)
{
char[] chars = new char[count];
Arrays.fill(chars, ' ');
return new String(chars);
}
private WriterContext(String key, String tableIndent, Writer output, IndentationPolicy indentationPolicy, DatePolicy datePolicy)
{
this.key = key;
this.output = output;
this.indentationPolicy = indentationPolicy;
this.currentTableIndent = tableIndent;
this.datePolicy = datePolicy;
this.currentFieldIndent = tableIndent + fillStringWithSpaces(this.indentationPolicy.getKeyValueIndent());
}
}