blob: f8f11832ba9210977ed0dcf5719520ea38d36fb5 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <getopt.h>
#include <cstdio>
#include <fstream>
#include <iostream>
#include <memory>
#include <utility>
#include <vector>
#include "build/tools/json_merge/json_merge.h"
static void usage(const char* exe_name) {
fprintf(
stderr,
"Usage: %s --input [infile] [--output outfile] [--minify]\n"
"\n"
"Merge one or more JSON files to a single JSON file.\n"
"If any input is not a valid JSON, the merge operation will fail.\n"
"Consequently you can \"merge\" one JSON file to perform validation.\n"
"If any two inputs overlap in the top-level key space, the merge "
"operation will fail.\n"
"Optionally the merged output can be minified.\n"
"Consequently you can \"merge\" one JSON file to perform "
"minification.\n"
"\n"
"Example usages:\n"
"%s --input in1.json --input in2.json # merges to STDOUT\n"
"%s --input in1.json --minify --output out.json # minifies to out.json\n"
"%s --help # prints this message\n",
exe_name, exe_name, exe_name, exe_name);
}
int main(int argc, char** argv) {
std::vector<input_file> inputs;
std::ofstream output_file;
auto output_buf = std::cout.rdbuf();
MergeConfig config;
static struct option long_options[] = {
{"input", required_argument, 0, 'i'}, {"output", required_argument, 0, 'o'},
{"relaxed", no_argument, 0, 'r'}, {"deep", no_argument, 0, 'd'},
{"minify", no_argument, 0, 'm'}, {"help", no_argument, 0, 'h'},
};
int opt;
while ((opt = getopt_long(argc, argv, "iordmh", long_options, nullptr)) != -1) {
switch (opt) {
case 'i': {
auto input = std::make_unique<std::ifstream>(optarg);
if (!input->is_open()) {
fprintf(stderr, "Could not read from input file %s\n", optarg);
return 1;
}
inputs.push_back({.name = optarg, .contents = std::move(input)});
break;
}
case 'o':
output_file.open(optarg);
if (!output_file.is_open()) {
fprintf(stderr, "Could not write to output file %s\n", optarg);
return 1;
}
output_buf = output_file.rdbuf();
break;
case 'r':
config.relaxed_input = true;
break;
case 'd':
config.deep_merge = true;
break;
case 'm':
config.minify = true;
break;
case 'h':
usage(argv[0]);
return 0;
}
}
std::ostream output(output_buf);
return JSONMerge(inputs, output, std::cerr, config);
}