#pragma once #include #include #include class AppHandler { public: template static void init(App & app, int _argc, char * _argv[]) { app.init(_argc, _argv); } template static int run(App & app, int _argc, char * _argv[]) { return app.run(); } }; class ServerAppHandler { public: template static void init(App & app, int _argc, char * _argv[]) { } template static int run(App & app, int _argc, char * _argv[]) { return app.run(_argc, _argv); } }; template class YandexAppMainFuncImpl { public: static int main(int _argc, char * _argv[]) { App app; try { AppHandler::init(app, _argc, _argv); return AppHandler::run(app, _argc, _argv); } catch (const Poco::Exception & _ex) { std::cerr << "POCO ERROR: " << _ex.displayText() << std::endl; app.logger().log(_ex); } catch (const std::exception & _ex) { std::cerr << "STD ERROR: " << _ex.what() << std::endl; app.logger().error(Poco::Logger::format ("Got exception: $0", _ex.what())); } catch (...) { std::cerr << "UNKNOWN ERROR" << std::endl; app.logger().error("Unknown exception"); } return Poco::Util::Application::EXIT_CONFIG; } }; #define YANDEX_APP_SERVER_MAIN_FUNC(AppServerClassName, main_func) int main_func(int _argc, char * _argv[]) { return YandexAppMainFuncImpl::main(_argc, _argv); } #define YANDEX_APP_MAIN_FUNC(AppClassName, main_func) int main_func(int _argc, char * _argv[]) { return YandexAppMainFuncImpl::main(_argc, _argv); } #define YANDEX_APP_SERVER_MAIN(AppServerClassName) YANDEX_APP_SERVER_MAIN_FUNC(AppServerClassName, main) #define YANDEX_APP_MAIN(AppClassName) YANDEX_APP_MAIN_FUNC(AppClassName, main)