001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.tools.template_engine;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import org.openstreetmap.josm.data.osm.search.SearchParseError;
007import org.openstreetmap.josm.tools.template_engine.Tokenizer.Token;
008import org.openstreetmap.josm.tools.template_engine.Tokenizer.TokenType;
009
010/**
011 * Exception thrown in case of an error during template parsing.
012 *
013 * Usually caused by invalid user input.
014 */
015public class ParseError extends Exception {
016
017    private final transient Token unexpectedToken;
018
019    public ParseError(Token unexpectedToken) {
020        super(tr("Unexpected token ({0}) on position {1}", unexpectedToken.getType(), unexpectedToken.getPosition()));
021        this.unexpectedToken = unexpectedToken;
022    }
023
024    public ParseError(Token unexpectedToken, TokenType expected) {
025        super(tr("Unexpected token on position {0}. Expected {1}, found {2}",
026                unexpectedToken.getPosition(), expected, unexpectedToken.getType()));
027        this.unexpectedToken = unexpectedToken;
028    }
029
030    public ParseError(int position, SearchParseError e) {
031        super(tr("Error while parsing search expression on position {0}", position), e);
032        unexpectedToken = null;
033    }
034
035    public ParseError(String message) {
036        super(message);
037        unexpectedToken = null;
038    }
039
040    public Token getUnexpectedToken() {
041        return unexpectedToken;
042    }
043
044    public static ParseError unexpectedChar(char expected, char found, int position) {
045        return new ParseError(tr("Unexpected char on {0}. Expected {1} found {2}", position, expected, found));
046    }
047}