#ifndef COMPILER_H
#define COMPILER_H
#include "probe.h"
#include "typecheck.h"
typedef struct {
char** argv;
size_t argc;
const char* subtitle_output;
bool clip_subtitles;
double clip_duration;
const char* concat_list;
const char* concat_left;
const char* concat_right;
} StagedCommand;
typedef struct {
Arena arena;
char** argv;
size_t argc;
StagedCommand* stages;
size_t stage_count;
size_t stage_capacity;
const char** temporary_paths;
size_t temporary_count;
size_t temporary_capacity;
const char** temporary_directories;
size_t temporary_directory_count;
size_t temporary_directory_capacity;
const char* executable_path;
const char* filter_complex;
const char* shell_command;
} CompiledCommand;
bool compile_program(const Program* program, const TypedProgram* typed, ProbeCache* probes,
const char* output_path, CompiledCommand* out, Error* error);
bool compile_program_with_ffmpeg_args(const Program* program, const TypedProgram* typed,
ProbeCache* probes, const char* output_path,
size_t ffmpeg_argument_count,
const char* const* ffmpeg_arguments,
CompiledCommand* out, Error* error);
void compiled_command_destroy(CompiledCommand* command);
bool execute_command(const CompiledCommand* command, int* exit_code, Error* error);
bool subtitle_clip_file(const char* path, double duration, Error* error);
bool subtitle_write_concat_list(const char* path, const char* left, const char* right, Error* error);
bool write_generated_file(const char* path, const char* contents, Error* error);
bool copy_generated_file(const char* source, const char* destination, Error* error);
bool ensure_generated_directory(const char* path, Error* error);
#endif