All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.electronwill.nightconfig.toml.ValueWriter Maven / Gradle / Ivy

There is a newer version: 3.8.1
Show newest version
package com.electronwill.nightconfig.toml;

import com.electronwill.nightconfig.core.Config;
import com.electronwill.nightconfig.core.io.CharacterOutput;
import com.electronwill.nightconfig.core.io.WritingException;

import java.time.temporal.Temporal;
import java.util.Iterator;
import java.util.List;

import static com.electronwill.nightconfig.core.NullObject.NULL_OBJECT;

/**
 * @author TheElectronWill
 */
final class ValueWriter {
	private static void writeString(String string, CharacterOutput output, TomlWriter writer) {
		if (writer.writesLiteral(string)) {
			if (writer.writesMultiline(string)) {
				StringWriter.writeLiteralMultiline(string, output);
			} else {
				StringWriter.writeLiteral(string, output);
			}
		} else {
			if (writer.writesMultiline(string)) {
				StringWriter.writeBasicMultiline(string, output, writer);
			} else {
				StringWriter.writeBasic(string, output);
			}
		}
	}
	/**
	 * Writes a value. This method calls the correct writing method based on the value's type.
	 */
	static void write(Object value, CharacterOutput output, TomlWriter writer) {
		if (value instanceof Config) {
			TableWriter.writeInline((Config)value, output, writer);
		} else if (value instanceof List) {
			List list = (List)value;
			if (!list.isEmpty() && list.stream().allMatch(Config.class::isInstance)) {// Array of tables
				Iterator iterator = list.iterator();
				while (iterator.hasNext()) {
					final Object table = iterator.next();
					TableWriter.writeInline((Config)table, output, writer);
					if (iterator.hasNext()) {
						output.write(ArrayWriter.ELEMENT_SEPARATOR);
					}
				}
			} else {// Normal array
				ArrayWriter.write((List)value, output, writer);
			}
		} else if (value instanceof CharSequence) {// String
			writeString(value.toString(), output, writer);
		} else if (value instanceof Enum) {// Enum value
			writeString(((Enum)value).name(), output, writer);
		} else if (value instanceof Temporal) {// Date or DateTime
			TemporalWriter.write((Temporal)value, output);
		} else if (value instanceof Float || value instanceof Double) {// Floating-point number
			double d = ((Number)value).doubleValue();
			if (Double.isNaN(d)) {
				output.write("nan");
			} else if (d == Double.POSITIVE_INFINITY) {
				output.write("+inf");
			} else if (d == Double.NEGATIVE_INFINITY) {
				output.write("-inf");
			} else {
				output.write(value.toString());
			}
		} else if (value instanceof Number || value instanceof Boolean) {
			output.write(value.toString());
		} else if (value == null || value == NULL_OBJECT) {
			throw new WritingException("TOML doesn't support null values");
		} else {
			throw new WritingException("Unsupported value type: " + value.getClass());
		}
	}

	private ValueWriter() {}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy