// Copyright 2014 The Chromium OS 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 BUFFET_ERROR_H_
#define BUFFET_ERROR_H_

#include <memory>
#include <string>

#include <base/basictypes.h>

namespace buffet {

class Error;  // Forward declaration.

typedef std::unique_ptr<Error> ErrorPtr;

class Error {
 public:
  virtual ~Error() = default;

  // Creates an instance of Error class.
  static ErrorPtr Create(const std::string& domain, const std::string& code,
                         const std::string& message);
  static ErrorPtr Create(const std::string& domain, const std::string& code,
                         const std::string& message, ErrorPtr inner_error);
  // If |error| is not nullptr, creates another instance of Error class,
  // initializes it with specified arguments and adds it to the head of
  // the error chain pointed to by |error|.
  static void AddTo(ErrorPtr* error, const std::string& domain,
                    const std::string& code, const std::string& message);
  // Same as the Error::AddTo above, but allows to pass in a printf-like
  // format string and optional parameters to format the error message.
  static void AddToPrintf(ErrorPtr* error, const std::string& domain,
                          const std::string& code,
                          const char* format, ...) PRINTF_FORMAT(4, 5);

  // Returns the error domain, code and message
  const std::string& GetDomain() const { return domain_; }
  const std::string& GetCode() const { return code_; }
  const std::string& GetMessage() const { return message_; }

  // Checks if this or any of the inner error in the chain has the specified
  // error domain.
  bool HasDomain(const std::string& domain) const;
  // Checks if this or any of the inner error in the chain matches the specified
  // error domain and code.
  bool HasError(const std::string& domain, const std::string& code) const;

  // Gets a pointer to the inner error, if present. Returns nullptr otherwise.
  const Error* GetInnerError() const { return inner_error_.get(); }

  // Gets a pointer to the first error occurred.
  // Returns itself if no inner error are available.
  const Error* GetFirstError() const;

 protected:
  // Constructor is protected since this object is supposed to be
  // created via the Create factory methods.
  Error(const std::string& domain, const std::string& code,
        const std::string& message, ErrorPtr inner_error);

  // Error domain. The domain defines the scopes for error codes.
  // Two errors with the same code but different domains are different errors.
  std::string domain_;
  // Error code. A unique error code identifier within the given domain.
  std::string code_;
  // Human-readable error message.
  std::string message_;
  // Pointer to inner error, if any. This forms a chain of errors.
  ErrorPtr inner_error_;

 private:
  DISALLOW_COPY_AND_ASSIGN(Error);
};

}  // namespace buffet

#endif  // BUFFET_ERROR_H_
