/
StringPredicateParser.java
52 lines (44 loc) · 1.37 KB
/
StringPredicateParser.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package org.petitparser.parser;
import org.petitparser.buffer.Buffer;
import org.petitparser.context.Context;
import org.petitparser.context.Result;
/**
* Parses a sequence of characters.
*
* @author Lukas Renggli (renggli@gmail.com)
*/
public class StringPredicateParser extends Parser {
public interface StringPredicate {
boolean apply(String argument);
}
private final int size;
private final StringPredicate predicate;
private final String message;
public StringPredicateParser(int size, StringPredicate predicate,
String message) {
this.size = size;
this.predicate = predicate;
this.message = message;
}
@Override
public Result parse(Context context) {
int start = context.getPosition();
int stop = start + size;
Buffer buffer = context.getBuffer();
if (stop <= buffer.size()) {
String result = buffer.subSequence(start, stop);
if (predicate.apply(result)) {
return context.success(result, stop);
}
}
return context.failure(message);
}
@Override
protected boolean matchesProperties(Parser other) {
StringPredicateParser otherPredicateParser = (StringPredicateParser) other;
return super.matchesProperties(other)
&& size == otherPredicateParser.size
&& predicate.equals(otherPredicateParser.predicate)
&& message.equals(otherPredicateParser.message);
}
}