// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef TOOLS_GN_PATTERN_H_
#define TOOLS_GN_PATTERN_H_

#include <stddef.h>

#include <string>
#include <vector>

#include "gn/value.h"

extern const char kFilePattern_Help[];

class Pattern {
 public:
  struct Subrange {
    enum Type {
      LITERAL,       // Matches exactly the contents of the string.
      ANYTHING,      // * (zero or more chars).
      PATH_BOUNDARY  // '/' or beginning of string.
    };

    explicit Subrange(Type t, const std::string& l = std::string())
        : type(t), literal(l) {}

    // Returns the minimum number of chars that this subrange requires.
    size_t MinSize() const {
      switch (type) {
        case LITERAL:
          return literal.size();
        case ANYTHING:
          return 0;
        case PATH_BOUNDARY:
          return 0;  // Can match beginning or end of string, which is 0 len.
        default:
          return 0;
      }
    }

    Type type;

    // When type == LITERAL this is the text to match.
    std::string literal;
  };

  explicit Pattern(const std::string& s);
  Pattern(const Pattern& other);
  ~Pattern();

  // Returns true if the current pattern matches the given string.
  bool MatchesString(const std::string& s) const;

 private:
  // allow_implicit_path_boundary determines if a path boundary should accept
  // matches at the beginning or end of the string.
  bool RecursiveMatch(const std::string& s,
                      size_t begin_char,
                      size_t subrange_index,
                      bool allow_implicit_path_boundary) const;

  std::vector<Subrange> subranges_;

  // Set to true when the subranges are "*foo" ("ANYTHING" followed by a
  // literal). This covers most patterns so we optimize for this.
  bool is_suffix_;
};

class PatternList {
 public:
  PatternList();
  PatternList(const PatternList& other);
  ~PatternList();

  bool is_empty() const { return patterns_.empty(); }

  void Append(const Pattern& pattern);

  // Initializes the pattern list from a give list of pattern strings. Sets
  // |*err| on failure.
  void SetFromValue(const Value& v, Err* err);

  bool MatchesString(const std::string& s) const;
  bool MatchesValue(const Value& v) const;

 private:
  std::vector<Pattern> patterns_;
};

#endif  // TOOLS_GN_PATTERN_H_
