#pragma once
#include <exception>
#include "configuration.h"
#include "data_source_interface.h"
#include <mw/http_server.hpp>
/// HTTP application serving the status tracker UI.
class App : public mw::HTTPServer
{
public:
/// Configure the listener, service definitions, and status storage.
/// The data source must outlive the application.
App(const ListenAddress& listen, Configuration configuration,
DataSourceInterface& data_source);
protected:
/// Register HTTP routes before the server starts.
void setup() override;
private:
/// Render the grouped service status page.
void serveIndex(const Request& request, Response& response) const;
/// Serve one embedded static resource.
static void serveStatic(const Request& request, Response& response);
/// Convert unexpected request exceptions into process termination.
static void unexpectedException(const Request& request,
Response& response,
std::exception_ptr exception) noexcept;
Configuration configuration;
DataSourceInterface& data_source;
};