// Copyright 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 COMPONENTS_URL_MATCHER_URL_MATCHER_FACTORY_H_
#define COMPONENTS_URL_MATCHER_URL_MATCHER_FACTORY_H_

#include <memory>
#include <string>

#include "base/macros.h"
#include "components/url_matcher/url_matcher.h"
#include "components/url_matcher/url_matcher_export.h"

namespace base {
class DictionaryValue;
class Value;
}

namespace url_matcher {

class URL_MATCHER_EXPORT URLMatcherFactory {
 public:
  // Creates a URLMatcherConditionSet from a UrlFilter dictionary as defined in
  // the declarative API. |url_fetcher_dict| contains the dictionary passed
  // by the extension, |id| is the identifier assigned to the created
  // URLMatcherConditionSet. In case of an error, |error| is set to contain
  // an error message.
  //
  // Note: In case this function fails or if you don't register the
  // URLMatcherConditionSet to the URLMatcher, you need to call
  // URLMatcher::ClearUnusedConditionSets() on the URLMatcher that owns this
  // URLMatcherFactory. Otherwise you leak memory.
  static scoped_refptr<URLMatcherConditionSet> CreateFromURLFilterDictionary(
      URLMatcherConditionFactory* url_matcher_condition_factory,
      const base::DictionaryValue* url_filter_dict,
      URLMatcherConditionSet::ID id,
      std::string* error);

 private:
  // Returns whether a condition attribute with name |condition_attribute_name|
  // needs to be handled by the URLMatcher.
  static bool IsURLMatcherConditionAttribute(
      const std::string& condition_attribute_name);

  // Factory method of for URLMatcherConditions.
  static URLMatcherCondition CreateURLMatcherCondition(
      URLMatcherConditionFactory* url_matcher_condition_factory,
      const std::string& condition_attribute_name,
      const base::Value* value,
      std::string* error);

  static std::unique_ptr<URLMatcherSchemeFilter> CreateURLMatcherScheme(
      const base::Value* value,
      std::string* error);

  static std::unique_ptr<URLMatcherPortFilter> CreateURLMatcherPorts(
      const base::Value* value,
      std::string* error);

  DISALLOW_IMPLICIT_CONSTRUCTORS(URLMatcherFactory);
};

}  // namespace url_matcher

#endif  // COMPONENTS_URL_MATCHER_URL_MATCHER_FACTORY_H_
