// Copyright 2020 The Tint Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef SRC_TINT_READER_SPIRV_FAIL_STREAM_H_
#define SRC_TINT_READER_SPIRV_FAIL_STREAM_H_

#include <ostream>

namespace tint {
namespace reader {
namespace spirv {

/// A FailStream object accumulates values onto a given std::ostream,
/// and can be used to record failure by writing the false value
/// to given a pointer-to-bool.
class FailStream {
 public:
  /// Creates a new fail stream
  /// @param status_ptr where we will write false to indicate failure. Assumed
  /// to be a valid pointer to bool.
  /// @param out output stream where a message should be written to explain
  /// the failure
  FailStream(bool* status_ptr, std::ostream* out)
      : status_ptr_(status_ptr), out_(out) {}
  /// Copy constructor
  /// @param other the fail stream to clone
  FailStream(const FailStream& other) = default;

  /// Converts to a boolean status. A true result indicates success,
  /// and a false result indicates failure.
  /// @returns the status
  operator bool() const { return *status_ptr_; }
  /// Returns the current status value.  This can be more readable
  /// the conversion operator.
  /// @returns the status
  bool status() const { return *status_ptr_; }

  /// Records failure.
  /// @returns a FailStream
  FailStream& Fail() {
    *status_ptr_ = false;
    return *this;
  }

  /// Appends the given value to the message output stream.
  /// @param val the value to write to the output stream.
  /// @returns this object
  template <typename T>
  FailStream& operator<<(const T& val) {
    *out_ << val;
    return *this;
  }

 private:
  bool* status_ptr_;
  std::ostream* out_;
};

}  // namespace spirv
}  // namespace reader
}  // namespace tint

#endif  // SRC_TINT_READER_SPIRV_FAIL_STREAM_H_
