blob: e6fd2c28a41da0e90b8dbf1f683589e5931c2324 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE
* file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file
* to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
package org.apache.tuweni.toml;
import static java.util.Objects.requireNonNull;
import static org.apache.tuweni.toml.Parser.parseDottedKey;
import static org.apache.tuweni.toml.Toml.joinKeyPath;
import static org.apache.tuweni.toml.TomlType.typeNameFor;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.BooleanSupplier;
import java.util.function.DoubleSupplier;
import java.util.function.LongSupplier;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
/**
* An interface for accessing data stored in Tom's Obvious, Minimal Language (TOML).
*/
public interface TomlTable {
/**
* @return The number of entries in tis table.
*/
int size();
/**
* @return {@code true} if there are no entries in this table.
*/
boolean isEmpty();
/**
* Check if a key was set in the TOML document.
*
* @param dottedKey A dotted key (e.g. {@code "server.port"}).
* @return {@code true} if the key was set in the TOML document.
* @throws IllegalArgumentException If the key cannot be parsed.
*/
default boolean contains(String dottedKey) {
requireNonNull(dottedKey);
return contains(parseDottedKey(dottedKey));
}
/**
* Check if a key was set in the TOML document.
*
* @param path The key path.
* @return {@code true} if the key was set in the TOML document.
*/
default boolean contains(List<String> path) {
try {
return get(path) != null;
} catch (TomlInvalidTypeException e) {
return false;
}
}
/**
* Get the keys of this table.
*
* <p>
* The returned set contains only immediate keys to this table, and not dotted keys or key paths. For a complete view
* of keys available in the TOML document, use {@link #dottedKeySet()} or {@link #keyPathSet()}.
*
* @return A set containing the keys of this table.
*/
Set<String> keySet();
/**
* Get all the dotted keys of this table.
*
* <p>
* Paths to intermediary and empty tables are not returned. To include these, use {@link #dottedKeySet(boolean)}.
*
* @return A set containing all the dotted keys of this table.
*/
default Set<String> dottedKeySet() {
return keyPathSet().stream().map(Toml::joinKeyPath).collect(Collectors.toSet());
}
/**
* Get all the dotted keys of this table.
*
* @param includeTables If {@code true}, also include paths to intermediary and empty tables.
* @return A set containing all the dotted keys of this table.
*/
default Set<String> dottedKeySet(boolean includeTables) {
return keyPathSet(includeTables).stream().map(Toml::joinKeyPath).collect(Collectors.toSet());
}
/**
* Get all the paths in this table.
*
* <p>
* Paths to intermediary and empty tables are not returned. To include these, use {@link #keyPathSet(boolean)}.
*
* @return A set containing all the key paths of this table.
*/
default Set<List<String>> keyPathSet() {
return keyPathSet(false);
}
/**
* Get all the paths in this table.
*
* @param includeTables If {@code true}, also include paths to intermediary and empty tables.
* @return A set containing all the key paths of this table.
*/
Set<List<String>> keyPathSet(boolean includeTables);
/**
* Get a value from the TOML document.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @return The value, or {@code null} if no value was set in the TOML document.
* @throws IllegalArgumentException If the key cannot be parsed.
* @throws TomlInvalidTypeException If any element of the path preceding the final key is not a table.
*/
@Nullable
default Object get(String dottedKey) {
requireNonNull(dottedKey);
return get(parseDottedKey(dottedKey));
}
/**
* Get a value from the TOML document.
*
* @param path The key path.
* @return The value, or {@code null} if no value was set in the TOML document.
* @throws TomlInvalidTypeException If any element of the path preceding the final key is not a table.
*/
@Nullable
Object get(List<String> path);
/**
* Get the position where a key is defined in the TOML document.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @return The input position, or {@code null} if the key was not set in the TOML document.
* @throws IllegalArgumentException If the key cannot be parsed.
* @throws TomlInvalidTypeException If any element of the path preceding the final key is not a table.
*/
@Nullable
default TomlPosition inputPositionOf(String dottedKey) {
requireNonNull(dottedKey);
return inputPositionOf(parseDottedKey(dottedKey));
}
/**
* Get the position where a key is defined in the TOML document.
*
* @param path The key path.
* @return The input position, or {@code null} if the key was not set in the TOML document.
* @throws TomlInvalidTypeException If any element of the path preceding the final key is not a table.
*/
@Nullable
TomlPosition inputPositionOf(List<String> path);
/**
* Check if a value in the TOML document is a string.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.hostname"}).
* @return {@code true} if the value can be obtained as a string.
* @throws IllegalArgumentException If the key cannot be parsed.
*/
default boolean isString(String dottedKey) {
requireNonNull(dottedKey);
return isString(parseDottedKey(dottedKey));
}
/**
* Check if a value in the TOML document is a string.
*
* @param path The key path.
* @return {@code true} if the value can be obtained as a string.
*/
default boolean isString(List<String> path) {
Object value;
try {
value = get(path);
} catch (TomlInvalidTypeException e) {
return false;
}
return value instanceof String;
}
/**
* Get a string from the TOML document.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.hostname"}).
* @return The value, or {@code null} if no value was set in the TOML document.
* @throws IllegalArgumentException If the key cannot be parsed.
* @throws TomlInvalidTypeException If the value is present but not a string, or any element of the path preceding the
* final key is not a table.
*/
@Nullable
default String getString(String dottedKey) {
requireNonNull(dottedKey);
return getString(parseDottedKey(dottedKey));
}
/**
* Get a string from the TOML document.
*
* @param path A dotted key (e.g. {@code "server.address.hostname"}).
* @return The value, or {@code null} if no value was set in the TOML document.
* @throws TomlInvalidTypeException If the value is present but not a string, or any element of the path preceding the
* final key is not a table.
*/
@Nullable
default String getString(List<String> path) {
Object value = get(path);
if (value == null) {
return null;
}
if (!(value instanceof String)) {
throw new TomlInvalidTypeException("Value of '" + joinKeyPath(path) + "' is a " + typeNameFor(value));
}
return (String) value;
}
/**
* Get a string from the TOML document, or return a default.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.hostname"}).
* @param defaultValue A supplier for the default value.
* @return The value, or the default.
* @throws IllegalArgumentException If the key cannot be parsed.
* @throws TomlInvalidTypeException If the value is present but not a string, or any element of the path preceding the
* final key is not a table.
*/
default String getString(String dottedKey, Supplier<String> defaultValue) {
requireNonNull(dottedKey);
return getString(parseDottedKey(dottedKey), defaultValue);
}
/**
* Get a string from the TOML document, or return a default.
*
* @param path The key path.
* @param defaultValue A supplier for the default value.
* @return The value, or the default.
* @throws TomlInvalidTypeException If the value is present but not a string, or any element of the path preceding the
* final key is not a table.
*/
default String getString(List<String> path, Supplier<String> defaultValue) {
requireNonNull(defaultValue);
String value = getString(path);
if (value != null) {
return value;
}
return defaultValue.get();
}
/**
* Check if a value in the TOML document is a long.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @return {@code true} if the value can be obtained as a long.
* @throws IllegalArgumentException If the key cannot be parsed.
*/
default boolean isLong(String dottedKey) {
requireNonNull(dottedKey);
return isLong(parseDottedKey(dottedKey));
}
/**
* Check if a value in the TOML document is a long.
*
* @param path The key path.
* @return {@code true} if the value can be obtained as a long.
*/
default boolean isLong(List<String> path) {
Object value;
try {
value = get(path);
} catch (TomlInvalidTypeException e) {
return false;
}
return value instanceof Long;
}
/**
* Get a long from the TOML document.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @return The value, or {@code null} if no value was set in the TOML document.
* @throws IllegalArgumentException If the key cannot be parsed.
* @throws TomlInvalidTypeException If the value is present but not a long, or any element of the path preceding the
* final key is not a table.
*/
@Nullable
default Long getLong(String dottedKey) {
requireNonNull(dottedKey);
return getLong(parseDottedKey(dottedKey));
}
/**
* Get a long from the TOML document.
*
* @param path The key path.
* @return The value, or {@code null} if no value was set in the TOML document.
* @throws TomlInvalidTypeException If the value is present but not a long, or any element of the path preceding the
* final key is not a table.
*/
@Nullable
default Long getLong(List<String> path) {
Object value = get(path);
if (value == null) {
return null;
}
if (!(value instanceof Long)) {
throw new TomlInvalidTypeException("Value of '" + joinKeyPath(path) + "' is a " + typeNameFor(value));
}
return (Long) value;
}
/**
* Get a long from the TOML document, or return a default.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @param defaultValue A supplier for the default value.
* @return The value, or the default.
* @throws IllegalArgumentException If the key cannot be parsed.
* @throws TomlInvalidTypeException If the value is present but not a long, or any element of the path preceding the
* final key is not a table.
*/
default long getLong(String dottedKey, LongSupplier defaultValue) {
requireNonNull(dottedKey);
return getLong(parseDottedKey(dottedKey), defaultValue);
}
/**
* Get a long from the TOML document, or return a default.
*
* @param path The key path.
* @param defaultValue A supplier for the default value.
* @return The value, or the default.
* @throws TomlInvalidTypeException If the value is present but not a long, or any element of the path preceding the
* final key is not a table.
*/
default long getLong(List<String> path, LongSupplier defaultValue) {
requireNonNull(defaultValue);
Long value = getLong(path);
if (value != null) {
return value;
}
return defaultValue.getAsLong();
}
/**
* Check if a value in the TOML document is a double.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @return {@code true} if the value can be obtained as a double.
* @throws IllegalArgumentException If the key cannot be parsed.
*/
default boolean isDouble(String dottedKey) {
requireNonNull(dottedKey);
return isDouble(parseDottedKey(dottedKey));
}
/**
* Check if a value in the TOML document is a double.
*
* @param path The key path.
* @return {@code true} if the value can be obtained as a double.
*/
default boolean isDouble(List<String> path) {
Object value;
try {
value = get(path);
} catch (TomlInvalidTypeException e) {
return false;
}
return value instanceof Double;
}
/**
* Get a double from the TOML document.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @return The value, or {@code null} if no value was set in the TOML document.
* @throws IllegalArgumentException If the key cannot be parsed.
* @throws TomlInvalidTypeException If the value is present but not a double, or any element of the path preceding the
* final key is not a table.
*/
@Nullable
default Double getDouble(String dottedKey) {
requireNonNull(dottedKey);
return getDouble(parseDottedKey(dottedKey));
}
/**
* Get a double from the TOML document.
*
* @param path A dotted key.
* @return The value, or {@code null} if no value was set in the TOML document.
* @throws TomlInvalidTypeException If the value is present but not a double, or any element of the path preceding the
* final key is not a table.
*/
@Nullable
default Double getDouble(List<String> path) {
Object value = get(path);
if (value == null) {
return null;
}
if (!(value instanceof Double)) {
throw new TomlInvalidTypeException("Value of '" + joinKeyPath(path) + "' is a " + typeNameFor(value));
}
return (Double) value;
}
/**
* Get a double from the TOML document, or return a default.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @param defaultValue A supplier for the default value.
* @return The value, or the default.
* @throws IllegalArgumentException If the key cannot be parsed.
* @throws TomlInvalidTypeException If the value is present but not a double, or any element of the path preceding the
* final key is not a table.
*/
default double getDouble(String dottedKey, DoubleSupplier defaultValue) {
requireNonNull(dottedKey);
return getDouble(parseDottedKey(dottedKey), defaultValue);
}
/**
* Get a double from the TOML document, or return a default.
*
* @param path The key path.
* @param defaultValue A supplier for the default value.
* @return The value, or the default.
* @throws TomlInvalidTypeException If the value is present but not a double, or any element of the path preceding the
* final key is not a table.
*/
default double getDouble(List<String> path, DoubleSupplier defaultValue) {
requireNonNull(defaultValue);
Double value = getDouble(path);
if (value != null) {
return value;
}
return defaultValue.getAsDouble();
}
/**
* Check if a value in the TOML document is a boolean.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @return {@code true} if the value can be obtained as a boolean.
* @throws IllegalArgumentException If the key cannot be parsed.
*/
default boolean isBoolean(String dottedKey) {
requireNonNull(dottedKey);
return isBoolean(parseDottedKey(dottedKey));
}
/**
* Check if a value in the TOML document is a boolean.
*
* @param path The key path.
* @return {@code true} if the value can be obtained as a boolean.
*/
default boolean isBoolean(List<String> path) {
Object value;
try {
value = get(path);
} catch (TomlInvalidTypeException e) {
return false;
}
return value instanceof Boolean;
}
/**
* Get a boolean from the TOML document.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @return The value, or {@code null} if no value was set in the TOML document.
* @throws IllegalArgumentException If the key cannot be parsed.
* @throws TomlInvalidTypeException If the value is present but not a boolean, or any element of the path preceding
* the final key is not a table.
*/
@Nullable
default Boolean getBoolean(String dottedKey) {
requireNonNull(dottedKey);
return getBoolean(parseDottedKey(dottedKey));
}
/**
* Get a boolean from the TOML document.
*
* @param path The key path.
* @return The value, or {@code null} if no value was set in the TOML document.
* @throws TomlInvalidTypeException If the value is present but not a boolean, or any element of the path preceding
* the final key is not a table.
*/
@Nullable
default Boolean getBoolean(List<String> path) {
Object value = get(path);
if (value == null) {
return null;
}
if (!(value instanceof Boolean)) {
throw new TomlInvalidTypeException("Value of '" + joinKeyPath(path) + "' is a " + typeNameFor(value));
}
return (Boolean) value;
}
/**
* Get a boolean from the TOML document, or return a default.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @param defaultValue A supplier for the default value.
* @return The value, or the default.
* @throws IllegalArgumentException If the key cannot be parsed.
* @throws TomlInvalidTypeException If the value is present but not a boolean, or any element of the path preceding
* the final key is not a table.
*/
default boolean getBoolean(String dottedKey, BooleanSupplier defaultValue) {
requireNonNull(dottedKey);
return getBoolean(parseDottedKey(dottedKey), defaultValue);
}
/**
* Get a boolean from the TOML document, or return a default.
*
* @param path The key path.
* @param defaultValue A supplier for the default value.
* @return The value, or the default.
* @throws TomlInvalidTypeException If the value is present but not a boolean, or any element of the path preceding
* the final key is not a table.
*/
default boolean getBoolean(List<String> path, BooleanSupplier defaultValue) {
requireNonNull(defaultValue);
Boolean value = getBoolean(path);
if (value != null) {
return value;
}
return defaultValue.getAsBoolean();
}
/**
* Check if a value in the TOML document is an {@link OffsetDateTime}.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @return {@code true} if the value can be obtained as an {@link OffsetDateTime}.
* @throws IllegalArgumentException If the key cannot be parsed.
*/
default boolean isOffsetDateTime(String dottedKey) {
requireNonNull(dottedKey);
return isOffsetDateTime(parseDottedKey(dottedKey));
}
/**
* Check if a value in the TOML document is an {@link OffsetDateTime}.
*
* @param path The key path.
* @return {@code true} if the value can be obtained as an {@link OffsetDateTime}.
*/
default boolean isOffsetDateTime(List<String> path) {
Object value;
try {
value = get(path);
} catch (TomlInvalidTypeException e) {
return false;
}
return value instanceof OffsetDateTime;
}
/**
* Get an offset date time from the TOML document.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @return The value, or {@code null} if no value was set in the TOML document.
* @throws IllegalArgumentException If the key cannot be parsed.
* @throws TomlInvalidTypeException If the value is present but not an {@link OffsetDateTime}, or any element of the
* path preceding the final key is not a table.
*/
@Nullable
default OffsetDateTime getOffsetDateTime(String dottedKey) {
requireNonNull(dottedKey);
return getOffsetDateTime(parseDottedKey(dottedKey));
}
/**
* Get an offset date time from the TOML document.
*
* @param path The key path.
* @return The value, or {@code null} if no value was set in the TOML document.
* @throws TomlInvalidTypeException If the value is present but not an {@link OffsetDateTime}, or any element of the
* path preceding the final key is not a table.
*/
@Nullable
default OffsetDateTime getOffsetDateTime(List<String> path) {
Object value = get(path);
if (value == null) {
return null;
}
if (!(value instanceof OffsetDateTime)) {
throw new TomlInvalidTypeException("Value of '" + joinKeyPath(path) + "' is a " + typeNameFor(value));
}
return (OffsetDateTime) value;
}
/**
* Get an offset date time from the TOML document, or return a default.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @param defaultValue A supplier for the default value.
* @return The value, or the default.
* @throws IllegalArgumentException If the key cannot be parsed.
* @throws TomlInvalidTypeException If the value is present but not an {@link OffsetDateTime}, or any element of the
* path preceding the final key is not a table.
*/
default OffsetDateTime getOffsetDateTime(String dottedKey, Supplier<OffsetDateTime> defaultValue) {
requireNonNull(dottedKey);
return getOffsetDateTime(parseDottedKey(dottedKey), defaultValue);
}
/**
* Get an offset date time from the TOML document, or return a default.
*
* @param path The key path.
* @param defaultValue A supplier for the default value.
* @return The value, or the default.
* @throws TomlInvalidTypeException If the value is present but not an {@link OffsetDateTime}, or any element of the
* path preceding the final key is not a table.
*/
default OffsetDateTime getOffsetDateTime(List<String> path, Supplier<OffsetDateTime> defaultValue) {
requireNonNull(defaultValue);
OffsetDateTime value = getOffsetDateTime(path);
if (value != null) {
return value;
}
return defaultValue.get();
}
/**
* Check if a value in the TOML document is a {@link LocalDateTime}.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @return {@code true} if the value can be obtained as a {@link LocalDateTime}.
* @throws IllegalArgumentException If the key cannot be parsed.
*/
default boolean isLocalDateTime(String dottedKey) {
requireNonNull(dottedKey);
return isLocalDateTime(parseDottedKey(dottedKey));
}
/**
* Check if a value in the TOML document is a {@link LocalDateTime}.
*
* @param path The key path.
* @return {@code true} if the value can be obtained as a {@link LocalDateTime}.
*/
default boolean isLocalDateTime(List<String> path) {
Object value;
try {
value = get(path);
} catch (TomlInvalidTypeException e) {
return false;
}
return value instanceof LocalDateTime;
}
/**
* Get a local date time from the TOML document.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @return The value, or {@code null} if no value was set in the TOML document.
* @throws IllegalArgumentException If the key cannot be parsed.
* @throws TomlInvalidTypeException If the value is present but not a {@link LocalDateTime}, or any element of the
* path preceding the final key is not a table.
*/
@Nullable
default LocalDateTime getLocalDateTime(String dottedKey) {
requireNonNull(dottedKey);
return getLocalDateTime(parseDottedKey(dottedKey));
}
/**
* Get a local date time from the TOML document.
*
* @param path The key path.
* @return The value, or {@code null} if no value was set in the TOML document.
* @throws TomlInvalidTypeException If the value is present but not a {@link LocalDateTime}, or any element of the
* path preceding the final key is not a table.
*/
@Nullable
default LocalDateTime getLocalDateTime(List<String> path) {
Object value = get(path);
if (value == null) {
return null;
}
if (!(value instanceof LocalDateTime)) {
throw new TomlInvalidTypeException("Value of '" + joinKeyPath(path) + "' is a " + typeNameFor(value));
}
return (LocalDateTime) value;
}
/**
* Get a local date time from the TOML document, or return a default.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @param defaultValue A supplier for the default value.
* @return The value, or the default.
* @throws IllegalArgumentException If the key cannot be parsed.
* @throws TomlInvalidTypeException If the value is present but not a {@link LocalDateTime}, or any element of the
* path preceding the final key is not a table.
*/
default LocalDateTime getLocalDateTime(String dottedKey, Supplier<LocalDateTime> defaultValue) {
requireNonNull(dottedKey);
return getLocalDateTime(parseDottedKey(dottedKey), defaultValue);
}
/**
* Get a local date time from the TOML document, or return a default.
*
* @param path The key path.
* @param defaultValue A supplier for the default value.
* @return The value, or the default.
* @throws TomlInvalidTypeException If the value is present but not a {@link LocalDateTime}, or any element of the
* path preceding the final key is not a table.
*/
default LocalDateTime getLocalDateTime(List<String> path, Supplier<LocalDateTime> defaultValue) {
requireNonNull(defaultValue);
LocalDateTime value = getLocalDateTime(path);
if (value != null) {
return value;
}
return defaultValue.get();
}
/**
* Check if a value in the TOML document is a {@link LocalDate}.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @return {@code true} if the value can be obtained as a {@link LocalDate}.
* @throws IllegalArgumentException If the key cannot be parsed.
*/
default boolean isLocalDate(String dottedKey) {
requireNonNull(dottedKey);
return isLocalDate(parseDottedKey(dottedKey));
}
/**
* Check if a value in the TOML document is a {@link LocalDate}.
*
* @param path The key path.
* @return {@code true} if the value can be obtained as a {@link LocalDate}.
*/
default boolean isLocalDate(List<String> path) {
Object value;
try {
value = get(path);
} catch (TomlInvalidTypeException e) {
return false;
}
return value instanceof LocalDate;
}
/**
* Get a local date from the TOML document.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @return The value, or {@code null} if no value was set in the TOML document.
* @throws IllegalArgumentException If the key cannot be parsed.
* @throws TomlInvalidTypeException If the value is present but not a {@link LocalDate}, or any element of the path
* preceding the final key is not a table.
*/
@Nullable
default LocalDate getLocalDate(String dottedKey) {
requireNonNull(dottedKey);
return getLocalDate(parseDottedKey(dottedKey));
}
/**
* Get a local date from the TOML document.
*
* @param path The key path.
* @return The value, or {@code null} if no value was set in the TOML document.
* @throws TomlInvalidTypeException If the value is present but not a {@link LocalDate}, or any element of the path
* preceding the final key is not a table.
*/
@Nullable
default LocalDate getLocalDate(List<String> path) {
Object value = get(path);
if (value == null) {
return null;
}
if (!(value instanceof LocalDate)) {
throw new TomlInvalidTypeException("Value of '" + joinKeyPath(path) + "' is a " + typeNameFor(value));
}
return (LocalDate) value;
}
/**
* Get a local date from the TOML document, or return a default.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @param defaultValue A supplier for the default value.
* @return The value, or the default.
* @throws IllegalArgumentException If the key cannot be parsed.
* @throws TomlInvalidTypeException If the value is present but not a {@link LocalDate}, or any element of the path
* preceding the final key is not a table.
*/
default LocalDate getLocalDate(String dottedKey, Supplier<LocalDate> defaultValue) {
requireNonNull(dottedKey);
return getLocalDate(parseDottedKey(dottedKey), defaultValue);
}
/**
* Get a local date from the TOML document, or return a default.
*
* @param path The key path.
* @param defaultValue A supplier for the default value.
* @return The value, or the default.
* @throws TomlInvalidTypeException If the value is present but not a {@link LocalDate}, or any element of the path
* preceding the final key is not a table.
*/
default LocalDate getLocalDate(List<String> path, Supplier<LocalDate> defaultValue) {
requireNonNull(defaultValue);
LocalDate value = getLocalDate(path);
if (value != null) {
return value;
}
return defaultValue.get();
}
/**
* Check if a value in the TOML document is a {@link LocalTime}.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @return {@code true} if the value can be obtained as a {@link LocalTime}.
* @throws IllegalArgumentException If the key cannot be parsed.
*/
default boolean isLocalTime(String dottedKey) {
requireNonNull(dottedKey);
return isLocalTime(parseDottedKey(dottedKey));
}
/**
* Check if a value in the TOML document is a {@link LocalTime}.
*
* @param path The key path.
* @return {@code true} if the value can be obtained as a {@link LocalTime}.
*/
default boolean isLocalTime(List<String> path) {
Object value;
try {
value = get(path);
} catch (TomlInvalidTypeException e) {
return false;
}
return value instanceof LocalTime;
}
/**
* Get a local time from the TOML document.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @return The value, or {@code null} if no value was set in the TOML document.
* @throws IllegalArgumentException If the key cannot be parsed.
* @throws TomlInvalidTypeException If the value is present but not a {@link LocalTime}, or any element of the path
* preceding the final key is not a table.
*/
@Nullable
default LocalTime getLocalTime(String dottedKey) {
requireNonNull(dottedKey);
return getLocalTime(parseDottedKey(dottedKey));
}
/**
* Get a local time from the TOML document.
*
* @param path The key path.
* @return The value, or {@code null} if no value was set in the TOML document.
* @throws TomlInvalidTypeException If the value is present but not a {@link LocalTime}, or any element of the path
* preceding the final key is not a table.
*/
@Nullable
default LocalTime getLocalTime(List<String> path) {
Object value = get(path);
if (value == null) {
return null;
}
if (!(value instanceof LocalTime)) {
throw new TomlInvalidTypeException("Value of '" + joinKeyPath(path) + "' is a " + typeNameFor(value));
}
return (LocalTime) value;
}
/**
* Get a local time from the TOML document, or return a default.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @param defaultValue A supplier for the default value.
* @return The value, or the default.
* @throws IllegalArgumentException If the key cannot be parsed.
* @throws TomlInvalidTypeException If the value is present but not a {@link LocalTime}, or any element of the path
* preceding the final key is not a table.
*/
default LocalTime getLocalTime(String dottedKey, Supplier<LocalTime> defaultValue) {
requireNonNull(dottedKey);
return getLocalTime(parseDottedKey(dottedKey), defaultValue);
}
/**
* Get a local time from the TOML document, or return a default.
*
* @param path The key path.
* @param defaultValue A supplier for the default value.
* @return The value, or the default.
* @throws TomlInvalidTypeException If the value is present but not a {@link LocalTime}, or any element of the path
* preceding the final key is not a table.
*/
default LocalTime getLocalTime(List<String> path, Supplier<LocalTime> defaultValue) {
requireNonNull(defaultValue);
LocalTime value = getLocalTime(path);
if (value != null) {
return value;
}
return defaultValue.get();
}
/**
* Check if a value in the TOML document is an array.
*
* @param dottedKey A dotted key (e.g. {@code "server.addresses"}).
* @return {@code true} if the value can be obtained as an array.
* @throws IllegalArgumentException If the key cannot be parsed.
*/
default boolean isArray(String dottedKey) {
requireNonNull(dottedKey);
return isArray(parseDottedKey(dottedKey));
}
/**
* Check if a value in the TOML document is an array.
*
* @param path The key path.
* @return {@code true} if the value can be obtained as an array.
*/
default boolean isArray(List<String> path) {
Object value;
try {
value = get(path);
} catch (TomlInvalidTypeException e) {
return false;
}
return value instanceof TomlArray;
}
/**
* Get an array from the TOML document.
*
* @param dottedKey A dotted key (e.g. {@code "server.addresses"}).
* @return The value, or {@code null} if no value was set in the TOML document.
* @throws IllegalArgumentException If the key cannot be parsed.
* @throws TomlInvalidTypeException If the value is present but not an array, or any element of the path preceding the
* final key is not a table.
*/
@Nullable
default TomlArray getArray(String dottedKey) {
requireNonNull(dottedKey);
return getArray(parseDottedKey(dottedKey));
}
/**
* Get an array from the TOML document.
*
* @param path The key path.
* @return The value, or {@code null} if no value was set in the TOML document.
* @throws TomlInvalidTypeException If the value is present but not an array, or any element of the path preceding the
* final key is not a table.
*/
@Nullable
default TomlArray getArray(List<String> path) {
Object value = get(path);
if (value == null) {
return null;
}
if (!(value instanceof TomlArray)) {
throw new TomlInvalidTypeException("Value of '" + joinKeyPath(path) + "' is a " + typeNameFor(value));
}
return (TomlArray) value;
}
/**
* Get an array from the TOML document.
*
* @param dottedKey A dotted key (e.g. {@code "server.addresses"}).
* @return The value, or an empty list if no list was set in the TOML document.
* @throws IllegalArgumentException If the key cannot be parsed.
* @throws TomlInvalidTypeException If the value is present but not an array, or any element of the path preceding the
* final key is not a table.
*/
default TomlArray getArrayOrEmpty(String dottedKey) {
requireNonNull(dottedKey);
return getArrayOrEmpty(parseDottedKey(dottedKey));
}
/**
* Get an array from the TOML document.
*
* @param path The key path.
* @return The value, or an empty list if no list was set in the TOML document.
* @throws TomlInvalidTypeException If the value is present but not an array, or any element of the path preceding the
* final key is not a table.
*/
default TomlArray getArrayOrEmpty(List<String> path) {
TomlArray value = getArray(path);
if (value != null) {
return value;
}
return MutableTomlArray.EMPTY;
}
/**
* Check if a value in the TOML document is a table.
*
* @param dottedKey A dotted key (e.g. {@code "server.address"}).
* @return {@code true} if the value can be obtained as a table.
* @throws IllegalArgumentException If the key cannot be parsed.
*/
default boolean isTable(String dottedKey) {
requireNonNull(dottedKey);
return isTable(parseDottedKey(dottedKey));
}
/**
* Check if a value in the TOML document is a table.
*
* @param path The key path.
* @return {@code true} if the value can be obtained as a table.
*/
default boolean isTable(List<String> path) {
Object value;
try {
value = get(path);
} catch (TomlInvalidTypeException e) {
return false;
}
return value instanceof TomlTable;
}
/**
* Get a table from the TOML document.
*
* @param dottedKey A dotted key (e.g. {@code "server.address"}).
* @return The value, or {@code null} if no value was set in the TOML document.
* @throws IllegalArgumentException If the key cannot be parsed.
* @throws TomlInvalidTypeException If the value is present but not a table, or any element of the path preceding the
* final key is not a table.
*/
@Nullable
default TomlTable getTable(String dottedKey) {
requireNonNull(dottedKey);
return getTable(parseDottedKey(dottedKey));
}
/**
* Get a table from the TOML document.
*
* @param path The key path.
* @return The value, or {@code null} if no value was set in the TOML document.
* @throws TomlInvalidTypeException If the value is present but not a table, or any element of the path preceding the
* final key is not a table.
*/
@Nullable
default TomlTable getTable(List<String> path) {
Object value = get(path);
if (value == null) {
return null;
}
if (!(value instanceof TomlTable)) {
throw new TomlInvalidTypeException("Value of '" + joinKeyPath(path) + "' is a " + typeNameFor(value));
}
return (TomlTable) value;
}
/**
* Get a table from the TOML document.
*
* @param dottedKey A dotted key (e.g. {@code "server.address.port"}).
* @return The value, or an empty table if no value was set in the TOML document.
* @throws IllegalArgumentException If the key cannot be parsed.
* @throws TomlInvalidTypeException If the value is present but not a table, or any element of the path preceding the
* final key is not a table.
*/
default TomlTable getTableOrEmpty(String dottedKey) {
requireNonNull(dottedKey);
return getTableOrEmpty(parseDottedKey(dottedKey));
}
/**
* Get a table from the TOML document.
*
* @param path The key path.
* @return The value, or an empty table if no value was set in the TOML document.
* @throws TomlInvalidTypeException If the value is present but not a table, or any element of the path preceding the
* final key is not a table.
*/
default TomlTable getTableOrEmpty(List<String> path) {
TomlTable value = getTable(path);
if (value != null) {
return value;
}
return MutableTomlTable.EMPTY;
}
/**
* Get the elements of this array as a {@link Map}.
*
* <p>
* Note that this does not do a deep conversion. If this array contains tables or arrays, they will be of type
* {@link TomlTable} or {@link TomlArray} respectively.
*
* @return The elements of this array as a {@link Map}.
*/
Map<String, Object> toMap();
/**
* Return a representation of this table using JSON.
*
* @return A JSON representation of this table.
*/
default String toJson() {
StringBuilder builder = new StringBuilder();
try {
toJson(builder);
} catch (IOException e) {
// not reachable
throw new UncheckedIOException(e);
}
return builder.toString();
}
/**
* Append a JSON representation of this table to the appendable output.
*
* @param appendable The appendable output.
* @throws IOException If an IO error occurs.
*/
default void toJson(Appendable appendable) throws IOException {
JsonSerializer.toJson(this, appendable);
}
}