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}