/*
 * Copyright 2015 Facebook, Inc.
 *
 * 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.
 */

#pragma once

#include <exception>
#include <string>

namespace folly {

class FutureException : public std::exception {

public:

  explicit FutureException(std::string message_arg)
    : message(message_arg) {}

  ~FutureException() throw(){}

  virtual const char *what() const throw() {
    return message.c_str();
  }

  bool operator==(const FutureException &other) const{
    return other.message == this->message;
  }

  bool operator!=(const FutureException &other) const{
    return !(*this == other);
  }

  protected:
    std::string message;
};

class BrokenPromise : public FutureException {
  public:
    explicit BrokenPromise() :
      FutureException("Broken promise") { }
};

class NoState : public FutureException {
  public:
    explicit NoState() : FutureException("No state") { }
};

class PromiseAlreadySatisfied : public FutureException {
  public:
    explicit PromiseAlreadySatisfied() :
      FutureException("Promise already satisfied") { }
};

class FutureNotReady : public FutureException {
  public:
    explicit FutureNotReady() :
      FutureException("Future not ready") { }
};

class FutureAlreadyRetrieved : public FutureException {
  public:
    explicit FutureAlreadyRetrieved () :
      FutureException("Future already retrieved") { }
};

class UsingUninitializedTry : public FutureException {
  public:
    explicit UsingUninitializedTry() :
      FutureException("Using unitialized try") { }
};

class FutureCancellation : public FutureException {
 public:
  FutureCancellation() : FutureException("Future was cancelled") {}
};

class TimedOut : public FutureException {
 public:
  TimedOut() : FutureException("Timed out") {}
};

class PredicateDoesNotObtain : public FutureException {
 public:
  PredicateDoesNotObtain() : FutureException("Predicate does not obtain") {}
};

}
