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