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

#ifndef EXTENSIONS_COMMON_INSTALL_WARNING_H_
#define EXTENSIONS_COMMON_INSTALL_WARNING_H_

#include <ostream>
#include <string>
#include <string_view>

namespace extensions {

// A struct to describe a non-fatal issue discovered in the installation of an
// extension.
struct InstallWarning {
  explicit InstallWarning(std::string_view message);
  InstallWarning(std::string_view message, std::string_view key);
  InstallWarning(std::string_view message,
                 std::string_view key,
                 std::string_view specific);
  InstallWarning(const InstallWarning&) = delete;
  InstallWarning(InstallWarning&& other);
  InstallWarning& operator=(InstallWarning&& other);
  ~InstallWarning();

  bool operator==(const InstallWarning& other) const {
    // We don't have to look at `key` or `specific` here, because they are each
    // used in the the message itself.
    // For example, a full message would be "Permission 'foo' is unknown or URL
    // pattern is malformed." `key` here is "permissions", and `specific` is
    // "foo", but these are redundant with the message.
    return message == other.message;
  }

  // The warning's message (human-friendly).
  std::string message;
  // Optional - for specifying the incorrect key in the manifest (e.g.,
  // "permissions").
  std::string key;
  // Optional - for specifying the incorrect portion of a key in the manifest
  // (e.g., an unrecognized permission "foo" in "permissions").
  std::string specific;
};

// Let gtest print InstallWarnings.
void PrintTo(const InstallWarning&, ::std::ostream* os);

}  // namespace extensions

#endif  // EXTENSIONS_COMMON_INSTALL_WARNING_H_
