// Copyright 2017 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef FXJS_CJS_RESULT_H_
#define FXJS_CJS_RESULT_H_

#include "fxjs/js_resources.h"
#include "third_party/base/optional.h"
#include "v8/include/v8-forward.h"

class CJS_Result {
 public:
  // Wrap constructors with static methods so we can apply WARN_UNUSED_RESULT,
  // otherwise we can't catch places where someone mistakenly writes:
  //
  //     if (error)
  //       CJS_Result(JS_ERROR_CODE);
  //
  // instead of
  //
  //     if (error)
  //       return CJS_Result(JS_ERROR_CODE);
  //
  static CJS_Result Success() WARN_UNUSED_RESULT { return CJS_Result(); }
  static CJS_Result Success(v8::Local<v8::Value> value) WARN_UNUSED_RESULT {
    return CJS_Result(value);
  }
  static CJS_Result Failure(const WideString& str) WARN_UNUSED_RESULT {
    return CJS_Result(str);
  }
  static CJS_Result Failure(JSMessage id) WARN_UNUSED_RESULT {
    return CJS_Result(id);
  }

  CJS_Result(const CJS_Result&);
  ~CJS_Result();

  bool HasError() const { return error_.has_value(); }
  WideString Error() const { return error_.value(); }

  bool HasReturn() const { return !return_.IsEmpty(); }
  v8::Local<v8::Value> Return() const { return return_; }

 private:
  CJS_Result();                               // Successful but empty return.
  explicit CJS_Result(v8::Local<v8::Value>);  // Successful return with value.
  explicit CJS_Result(const WideString&);     // Error with custom message.
  explicit CJS_Result(JSMessage id);          // Error with stock message.

  Optional<WideString> error_;
  v8::Local<v8::Value> return_;
};

#endif  // FXJS_CJS_RESULT_H_
