1*023bc8eaSKudo Chien #pragma once
2*023bc8eaSKudo Chien 
3*023bc8eaSKudo Chien #include <memory>
4*023bc8eaSKudo Chien #include <string>
5*023bc8eaSKudo Chien #include "Scheduler.h"
6*023bc8eaSKudo Chien 
7*023bc8eaSKudo Chien namespace reanimated {
8*023bc8eaSKudo Chien 
9*023bc8eaSKudo Chien struct ErrorWrapper {
10*023bc8eaSKudo Chien   std::string message = "";
11*023bc8eaSKudo Chien   bool handled = true;
12*023bc8eaSKudo Chien };
13*023bc8eaSKudo Chien 
14*023bc8eaSKudo Chien class ErrorHandler {
15*023bc8eaSKudo Chien  public:
raise()16*023bc8eaSKudo Chien   bool raise() {
17*023bc8eaSKudo Chien     if (getError()->handled) {
18*023bc8eaSKudo Chien       return false;
19*023bc8eaSKudo Chien     }
20*023bc8eaSKudo Chien     this->getScheduler()->scheduleOnUI([this]() mutable { this->raiseSpec(); });
21*023bc8eaSKudo Chien     return true;
22*023bc8eaSKudo Chien   }
23*023bc8eaSKudo Chien   virtual std::shared_ptr<Scheduler> getScheduler() = 0;
24*023bc8eaSKudo Chien   virtual std::shared_ptr<ErrorWrapper> getError() = 0;
25*023bc8eaSKudo Chien   virtual void setError(std::string message) = 0;
~ErrorHandler()26*023bc8eaSKudo Chien   virtual ~ErrorHandler() {}
27*023bc8eaSKudo Chien 
28*023bc8eaSKudo Chien  protected:
29*023bc8eaSKudo Chien   virtual void raiseSpec() = 0;
30*023bc8eaSKudo Chien };
31*023bc8eaSKudo Chien 
32*023bc8eaSKudo Chien } // namespace reanimated
33