This repository has been archived by the owner on Feb 26, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ParseWarnCollector.java
141 lines (124 loc) · 5.03 KB
/
ParseWarnCollector.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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*
* Copyright (C) 2024 Andre601
*
* Original Copyright and License (C) 2020 Florian Stober
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package ch.andre601.expressionparser;
import ch.andre601.expressionparser.internal.CheckUtil;
import java.util.ArrayList;
import java.util.List;
/**
* Simple class that is used by the {@link DefaultExpressionParserEngine} and the
* {@link ch.andre601.expressionparser.expressions.ExpressionTokenizer} for when an issue appears.
* <br>Errors will be collected together and returned using this ParseWarnCollector class. What happens with the collected
* warnings is up to you to decide.
*/
public class ParseWarnCollector{
private final String expression;
private final List<Context> warnings = new ArrayList<>();
/**
* Creates a new instance of the ParseWarnCollector, with the expression it is used on set.
*
* @param expression
* Not-null String containing the expression this ParseWarnCollector is used for.
*
* @throws IllegalArgumentException
* Should the provided String be null or empty.
*/
public ParseWarnCollector(String expression){
CheckUtil.notNullOrEmpty(expression, ParseWarnCollector.class, "Expression");
this.expression = expression;
}
/**
* Adds a new warning without an exact position within the text. This method uses the
* {@link String#format(String, Object...) format method} of the String class to replace placeholders within the String.
*
* @param warning
* The warning to add. May contain String.format compatible placeholders.
* @param args
* Optional array of values to put into the String.
*/
public void appendWarningFormatted(String warning, Object... args){
appendWarningFormatted(-1, warning, args);
}
/**
* Adds a new warning without an exact position within the text.
*
* @param warning
* The warning to add.
*/
public void appendWarning(String warning){
appendWarning(-1, warning);
}
/**
* Adds a new warning with a specific position of where the error appeared. This method uses the
* {@link String#format(String, Object...) format method} of the String class to replace placeholders within the String.
*
* @param position
* The position in the expression String for where the issue happened.
* @param warning
* The warning to add. May contain String.format compatible placeholders.
* @param args
* Optional array of values to put into the String.
*/
public void appendWarningFormatted(int position, String warning, Object... args){
CheckUtil.notNullOrEmpty(warning, ParseWarnCollector.class, "Warning");
CheckUtil.noneNull(ParseWarnCollector.class, "Args", args);
appendWarning(position, String.format(warning, args));
}
public String getExpression(){
return expression;
}
/**
* Adds a new warning with a specific position of where the error appeared.
*
* @param position
* The position in the expression String for where the issue happened.
* @param warning
* The warning to add.
*/
public void appendWarning(int position, String warning){
CheckUtil.notNullOrEmpty(warning, ParseWarnCollector.class, "Warning");
warnings.add(new Context(position, warning));
}
/**
* Returns whether the ParseWarnCollector has collected any warnings.
*
* @return True if ParseWarnCollector has any warnings, false otherwise.
*/
public boolean hasWarnings(){
return !getWarnings().isEmpty();
}
/**
* Returns a List of {@link Context Context instances} which may contain a position and warning.
*
* @return Possibly-empty List of Context instances.
*/
public List<Context> getWarnings(){
return warnings;
}
/**
* Record used to hold the position of where an issue appeared and the warning itself.
* <br>In case of {@link #appendWarning(String)} or {@link #appendWarningFormatted(String, Object...)} being used
* will the position be {@code -1}.
*
* @param position
* The position of where the issue happened in the expression.
* @param message
* The message to include.
*/
public record Context(int position, String message){}
}