// Copyright 2014 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.devtools.build.lib.events;

import java.util.regex.Pattern;

/**
 * An output filter for warnings.
 */
public interface OutputFilter {

  /** An output filter that matches everything. */
  public static final OutputFilter OUTPUT_EVERYTHING = new OutputFilter() {
    @Override
    public boolean showOutput(String tag) {
      return true;
    }
  };

  /** An output filter that matches nothing. */
  public static final OutputFilter OUTPUT_NOTHING = new OutputFilter() {
    @Override
    public boolean showOutput(String tag) {
      return false;
    }
  };

  /**
   * Returns true iff the given tag matches the output filter.
   */
  boolean showOutput(String tag);

  /**
   * An output filter using regular expression matching.
   */
  public static final class RegexOutputFilter implements OutputFilter {
    /** Returns an output filter for the given regex (by compiling it). */
    public static OutputFilter forRegex(String regex) {
      return new RegexOutputFilter(Pattern.compile(regex));
    }

    /** Returns an output filter for the given pattern. */
    public static OutputFilter forPattern(Pattern pattern) {
      return new RegexOutputFilter(pattern);
    }

    private final Pattern pattern;

    private RegexOutputFilter(Pattern pattern) {
      this.pattern = pattern;
    }

    @Override
    public boolean showOutput(String tag) {
      return pattern.matcher(tag).find();
    }

    @Override
    public String toString() {
      return pattern.toString();
    }
  }
}
