AbstractC4Rule.java

package org.thewonderlemming.c4plantuml.linter.rules.builtin;

import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.antlr.v4.runtime.Parser;
import org.antlr.v4.runtime.tree.ParseTree;
import org.thewonderlemming.c4plantuml.grammars.SourceType;
import org.thewonderlemming.c4plantuml.grammars.generated.C4L1Parser;
import org.thewonderlemming.c4plantuml.grammars.generated.C4L2Parser;
import org.thewonderlemming.c4plantuml.grammars.generated.C4L3Parser;
import org.thewonderlemming.c4plantuml.linter.rules.AbstractLintingRule;
import org.thewonderlemming.c4plantuml.linter.rules.RuleParameters;

/**
 * A base implementation of {@link AbstractLintingRule} that provides default support for C4 levels 1 to 3.
 *
 * @author thewonderlemming
 *
 */
public abstract class AbstractC4Rule extends AbstractLintingRule {

    /**
     * Default constructor.
     *
     * @param parameters the {@link RuleParameters} to pass to control the behavior of the rule.
     */
    protected AbstractC4Rule(final RuleParameters parameters) {
        super(parameters);
    }

    @Override
    public Set<Class<? extends Parser>> acceptableParsersTypes() {

        return Stream
            .of(SourceType.C4_L1, SourceType.C4_L2, SourceType.C4_L3)
                .map(SourceType::getParserType)
                .collect(Collectors.toSet());
    }

    @Override
    public Optional<ParseTree> selectParseTree(final Parser parser) {

        final ParseTree tree;

        if (parser instanceof C4L1Parser) {
            tree = ((C4L1Parser) parser).diagram();

        } else if (parser instanceof C4L2Parser) {
            tree = ((C4L2Parser) parser).diagram();

        } else if (parser instanceof C4L3Parser) {
            tree = ((C4L3Parser) parser).diagram();

        } else {
            getLogger().error("Unsupported parser type {} was given", parser.getClass());
            return Optional.empty();
        }

        return Optional.of(tree);
    }

    @Override
    public void wrapUp() {
        // Override this if you want to add custom behavior at the end of a file
        // parsing.
    }
}