Skip to content
Snippets Groups Projects
main.cpp 5.50 KiB
#include "czi_parser.h"
#include "compression/benchmark.h"
#include "utilities/args.hxx"

int main(int argc, char **argv)
{
    args::ArgumentParser argParser("CZI file tools", "Optional arguments are in `[]` necessary in `<>`.");
    // Groups
    args::Group cziFileGroup(argParser, "CZI file input - necessary.", args::Group::Validators::All);
    args::Group mainMethodGroup(argParser, "Methods:", args::Group::Validators::AtMostOne);
    args::Group optionsGroup(argParser, "Program options:", args::Group::Validators::DontCare);
    args::Group compressionGroup(argParser, "Avaible compressions", args::Group::Validators::AtMostOne);

    // Main option, has to be set. Czi file.
    args::ValueFlag<std::string> cziFile(cziFileGroup, "czi file", "CZI file to load.", {'i', "input"});

    // Program methods.
    args::HelpFlag helpMethod(mainMethodGroup, "help", "Print help", {'h', "help"});
    args::Flag reportMethod(mainMethodGroup, "report", "Basic information about CZI file. [verbose]", {"report"});
    args::Flag compressionTestMethod(mainMethodGroup, "compression-test", "Compress subblocks and output compression ratios <compression method>", {"compression-test"});
    args::Flag versionMethod(mainMethodGroup, "Version test", "Check version", {"version", 'V'});
    args::Flag benchmarkMethod(mainMethodGroup, "Compression benchmark", "Start compression benchmark for selected CZI file. <report-file> [continuos] [verbose].", {"benchmark"});
    args::Flag exportDataMethod(mainMethodGroup, "Export binary dat", "Export raw image data <folder> [continuos]", {"dump-data"});
    args::Flag exportImagesMethod(mainMethodGroup, "Export images", "Export images to ppm files <folder>", {"dump-images"});

    // Options
    args::Flag dontParseMetadataOption(optionsGroup, "no metadata", "Dont read metadata byte", {"no-metadata"});
    args::Flag verboseOption(optionsGroup, "verbose", "Extend output of method", {'v', "verbose"});
    args::ValueFlag<int> compressionLevelOption(optionsGroup, "Compression level", "Compression level", {'l', "level"});
    args::ValueFlag<std::string> folderOption(optionsGroup, "Folder", "Folder to which save exported items.", {'f', "folder"});
    args::ValueFlag<std::string> reportFileOption(optionsGroup, "Report file", "File where to write report.", {'r', "report"});
    args::Flag gzipCompressionOption(compressionGroup, "GZIP", "GZIP (zlib) compression", {"gzip"});
    args::Flag lzmaCompressionOption(compressionGroup, "LZMA", "LZMA (2?) compression", {"lzma"});
    args::Flag bzip2CompressionOption(compressionGroup, "BZIP2", "BZip2 compression", {"bzip2"});
    args::Flag continuousCompressionOption(compressionGroup, "Continuos compression", "Compress continuos array of image data into one buffer.", {'c'});

    try
    {
        argParser.helpParams.width *= 2;
        argParser.ParseCLI(argc, argv);
    }
    catch (args::Help &)
    {
        std::cout << argParser;
        return 0;
    }
    catch (args::ValidationError &e)
    {
        printf(RED "%s Check help with -h or --help.\n" RESET, e.what());
        return 1;
    }
    catch (args::ParseError &pe)
    {
        printf(RED "%s Check help with -h or --help.\n" RESET, pe.what());
        return 1;
    }

    if (versionMethod)
    {
#if DEBUG
        printf("DEBUG\n");
#else
        printf("RELEASE\n");
#endif
        return 0;
    }

    CziParser parser(dontParseMetadataOption.Get());
    auto parsedFile = parser.parse_czi_file(cziFile.Get());
    if (benchmarkMethod)
    {
        if (!reportFileOption.Matched())
        {
            printf(RED "Report file wasn't specified!\n" RESET);
            return 1;
        }
        int level = -1;
        if (compressionLevelOption.Matched())
            level = compressionLevelOption.Get();

        if (continuousCompressionOption.Matched())
        {
            benchmark_continuos_compression(parsedFile, reportFileOption.Get(), verboseOption.Matched(), level);
        }
        else
        {
            benchmark_compression(parsedFile, reportFileOption.Get(), verboseOption.Matched(), level);
        }

        return 0;
    }

    // Test compression method.
    if (compressionTestMethod)
    {
        CompressionMethod cm = CompressionMethod_GZIP;

        if (gzipCompressionOption)
            cm = CompressionMethod_GZIP;
        else if (lzmaCompressionOption)
            cm = CompressionMethod_LZMA;
        else if (bzip2CompressionOption)
            cm = CompressionMethod_BZIP2;

        int level = 6;
        if (compressionLevelOption.Matched())
            level = compressionLevelOption.Get();
        else
            printf("Using default compression level: %i\n", level);

        parsedFile.test_compression(cm, verboseOption.Matched(), level);
        return 0;
    }

    if (reportMethod)
    {
        if (verboseOption.Matched())
            parsedFile.report_verbose();
        else
            parsedFile.report();

        return 0;
    }

    if (exportDataMethod || exportImagesMethod)
    {
        if (!folderOption.Matched())
        {
            printf(RED "Folder must be specified!\n" RESET);
            return 1;
            fs_wrapper::create_directory_path(folderOption.Get());
        }

        if (exportDataMethod && continuousCompressionOption)
        {
            parsedFile.dump_continuous_data(folderOption.Get());
            return 0;
        }
        if (exportDataMethod) // Raw data.
            parsedFile.dump_data(folderOption.Get());
        else // Images.
            parsedFile.dump_images(folderOption.Get());

        return 0;
    }
    return 0;
}