001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.tools;
003
004import java.util.Map;
005import java.util.function.Function;
006
007/**
008 * Utility class to parse various types from strings.
009 *
010 * @since 16181
011 */
012public class StringParser extends GenericParser<String> {
013
014    /**
015     * The default instance supports parsing {@link String}, {@link Character}, {@link Boolean},
016     * {@link Byte}, {@link Short}, {@link Integer}, {@link Long}, {@link Float}, {@link Double} (in their primitive and boxed form).
017     */
018    public static final StringParser DEFAULT = new StringParser(Utils.toUnmodifiableMap(new StringParser()
019            .registerParser(String.class, Function.identity())
020            .registerParser(char.class, value -> value.charAt(0))
021            .registerParser(Character.class, value -> value.charAt(0))
022            .registerParser(boolean.class, Boolean::parseBoolean)
023            .registerParser(Boolean.class, Boolean::parseBoolean)
024            .registerParser(byte.class, Byte::parseByte)
025            .registerParser(Byte.class, Byte::parseByte)
026            .registerParser(short.class, Short::parseShort)
027            .registerParser(Short.class, Short::parseShort)
028            .registerParser(int.class, Integer::parseInt)
029            .registerParser(Integer.class, Integer::parseInt)
030            .registerParser(long.class, Long::parseLong)
031            .registerParser(Long.class, Long::parseLong)
032            .registerParser(float.class, Float::parseFloat)
033            .registerParser(Float.class, Float::parseFloat)
034            .registerParser(double.class, Double::parseDouble)
035            .registerParser(Double.class, Double::parseDouble)
036            .parsers));
037
038    /**
039     * Creates an empty {@code StringParser}
040     */
041    public StringParser() {
042        super();
043    }
044
045    /**
046     * Creates a new {@code StringParser} by deeply copying {@code parser}
047     *
048     * @param parser the parser to copy
049     */
050    public StringParser(StringParser parser) {
051        super(parser);
052    }
053
054    private StringParser(Map<Class<?>, Function<String, ?>> parsers) {
055        super(parsers);
056    }
057
058    @Override
059    public <T> StringParser registerParser(Class<T> type, Function<String, T> value) {
060        super.registerParser(type, value);
061        return this;
062    }
063}