|  | // 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(); | 
|  | bool minify = false; | 
|  |  | 
|  | static struct option long_options[] = { | 
|  | {"input", required_argument, 0, 'i'}, | 
|  | {"output", required_argument, 0, 'o'}, | 
|  | {"minify", no_argument, 0, 'm'}, | 
|  | {"help", no_argument, 0, 'h'}, | 
|  | }; | 
|  |  | 
|  | int opt; | 
|  | while ((opt = getopt_long(argc, argv, "iomh", 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 'm': | 
|  | minify = true; | 
|  | break; | 
|  |  | 
|  | case 'h': | 
|  | usage(argv[0]); | 
|  | return 0; | 
|  | } | 
|  | } | 
|  |  | 
|  | std::ostream output(output_buf); | 
|  | return JSONMerge(inputs, output, std::cerr, minify); | 
|  | } |