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