/** * Runs the whitespace parser followed by `parser`, returning result of the latter. * * @param <T> the type the target parser returns * @param parser the target parser to run * @return the specified parser */ public static <T> Parser<T> whitespace(Parser<T> parser) { return prefix(whitespace(), parser); }
public static <T> BetweenParser<T> liberalBetween(String start, Parser<T> parser, String end) { return new BetweenParser<T>(whitespace(expect(start)), whitespace(parser), whitespace(expect(end))); }
@Override public MapType parse(ParserState input) throws ParseException { ExpectationResult result = Parsers.expect("map").parse(input); if (Parsers.nullOrUnexpected(result)) { return null; } Parser<KeyValue<ConjureType, ConjureType>> kv = Parsers.liberalBetween( "<", new KeyValueParser<>( Parsers.whitespace(TypeParser.INSTANCE), Parsers.whitespace(Parsers.expect(",")), Parsers.whitespace(TypeParser.INSTANCE)), ">"); KeyValue<ConjureType, ConjureType> types = kv.parse(input); ConjureMetrics.incrementCounter(MapType.class); return MapType.of(types.getKey(), types.getValue()); } }
@Test public void testListParser() throws ParseException { List<String> list = new ArrayList<>(); list.add("abc"); list.add("def"); assertEquals(list, new ListParser<>(new QuotedStringParser(), Parsers.whitespace()) .parse(new StringParserState("\"abc\" \"def\""))); }
@Test public void testDispatchingParser() throws ParseException { Map<String, Parser<String>> map = new HashMap<String, Parser<String>>(); map.put("dir1", new RawStringParser()); map.put("dir2", new QuotedStringParser()); assertEquals("def", new DispatchingParser<String>(map, Parsers.whitespace()) .parse(new StringParserState("dir1 abc\ndir2 \"def\n\"\n"))); assertEquals("def", new DispatchingParser<String>(map, Parsers.whitespace()) .parse(new StringParserState("dir1 abc\ndir2 \"def\n\"\n"))); }
@Test public void testMapParser() throws ParseException { Map<String, String> map = new HashMap<String, String>(); map.put("abc", "def"); assertEquals(map, new MapParser<String, String>(new RawStringParser(), Parsers.prefix(Parsers.whitespace(), new RawStringParser()), Parsers.whitespace()).parse( new StringParserState("abc def"))); assertEquals(map, new MapParser<String, String>(Parsers.prefix(Parsers.whitespace(), new RawStringParser()), Parsers.prefix(Parsers.whitespace(), new RawStringParser()), Parsers.whitespace()).parse( new StringParserState(" abc def"))); map.put("ghi", "jkl"); assertEquals(map, new MapParser<String, String>(Parsers.prefix(Parsers.whitespace(), new RawStringParser()), Parsers.prefix(Parsers.whitespace(), new RawStringParser()), Parsers.whitespace()).parse( new StringParserState("abc def ghi jkl"))); }
@Test public void testMapParserBuiltup() throws ParseException { Map<String, String> map = new HashMap<String, String>(); map.put("abc", "def"); RawStringParser noWhitespaceStringParser = new RawStringParser(); Parser<String> whitespaceStringParser = Parsers.prefix(Parsers.whitespace(), new RawStringParser()); MapParser<String, String> mapParser1 = new MapParser<String, String>(noWhitespaceStringParser, whitespaceStringParser, Parsers.whitespace()); MapParser<String, String> mapParser2 = new MapParser<String, String>(whitespaceStringParser, whitespaceStringParser, Parsers.whitespace()); assertEquals(map, mapParser1.parse(new StringParserState("abc def"))); assertEquals(map, mapParser2.parse(new StringParserState(" abc def"))); map.put("ghi", "jkl"); assertEquals(map, mapParser2.parse(new StringParserState("abc def ghi jkl"))); }
@Test public void testBetweenParser() throws ParseException { assertEquals("abcdef", new BetweenParser<String>(new ExpectantParser("{"), Parsers.prefix(Parsers.whitespace(), new RawStringParser()), Parsers.prefix(Parsers.whitespace(), new ExpectantParser("}"))) .parse(new StringParserState("{ abcdef }"))); }