// file      : mod/external-handler.hxx -*- C++ -*-
// license   : MIT; see accompanying LICENSE file

#ifndef MOD_EXTERNAL_HANDLER_HXX
#define MOD_EXTERNAL_HANDLER_HXX

#include <libbutl/manifest-parser.mxx>

#include <libbrep/types.hxx>
#include <libbrep/utility.hxx>

#include <mod/diagnostics.hxx>

namespace brep
{
  // Utility for running external handler programs.
  //
  namespace external_handler
  {
    // Run an external handler program and, if it exited normally with the
    // zero exit status, return the result manifest it is expected to write to
    // stdout, containing at least the HTTP status value. Otherwise, log an
    // error and return nullopt. Redirect the program stderr to the web server
    // error log.
    //
    // If the timeout (in seconds) is not zero and the handler program does
    // not exit in the allotted time, then it is killed and its termination is
    // treated as abnormal.
    //
    // Note that warnings can be logged regardless of the program success. If
    // the trace argument is not NULL, then trace records are also logged.
    //
    struct result_manifest
    {
      uint16_t status;

      // All values, including status but excluding format version and
      // end-of-manifest.
      //
      vector<butl::manifest_name_value> values;
    };

    optional<result_manifest>
    run (const path& handler,
         const strings& args,
         const dir_path& data_dir,
         size_t timeout,
         const basic_mark& error,
         const basic_mark& warn,
         const basic_mark* trace);
  }
}

#endif // MOD_EXTERNAL_HANDLER_HXX