1/*
2 * Copyright 2017 Google Inc. All rights reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "flatbuffers/flatbuffers.h"
18#include "flatbuffers/idl.h"
19#include "flatbuffers/util.h"
20#include <functional>
21#include <limits>
22#include <string>
23
24#ifndef FLATC_H_
25#define FLATC_H_
26
27namespace flatbuffers {
28
29class FlatCompiler {
30 public:
31  // Output generator for the various programming languages and formats we
32  // support.
33  struct Generator {
34    typedef bool (*GenerateFn)(const flatbuffers::Parser &parser,
35                               const std::string &path,
36                               const std::string &file_name);
37    typedef std::string (*MakeRuleFn)(const flatbuffers::Parser &parser,
38                                      const std::string &path,
39                                      const std::string &file_name);
40
41    GenerateFn generate;
42    const char *generator_opt_short;
43    const char *generator_opt_long;
44    const char *lang_name;
45    GenerateFn generateGRPC;
46    flatbuffers::IDLOptions::Language lang;
47    const char *generator_help;
48    MakeRuleFn make_rule;
49  };
50
51  typedef void (*WarnFn)(const FlatCompiler *flatc,
52                         const std::string &warn,
53                         bool show_exe_name);
54
55  typedef void (*ErrorFn)(const FlatCompiler *flatc,
56                          const std::string &err,
57                          bool usage, bool show_exe_name);
58
59  // Parameters required to initialize the FlatCompiler.
60  struct InitParams {
61    InitParams()
62        : generators(nullptr),
63          num_generators(0),
64          warn_fn(nullptr),
65          error_fn(nullptr) {}
66
67    const Generator* generators;
68    size_t num_generators;
69    WarnFn warn_fn;
70    ErrorFn error_fn;
71  };
72
73  explicit FlatCompiler(const InitParams& params) : params_(params) {}
74
75  int Compile(int argc, const char** argv);
76
77  std::string GetUsageString(const char* program_name) const;
78
79 private:
80  void ParseFile(flatbuffers::Parser &parser,
81                 const std::string &filename,
82                 const std::string &contents,
83                 std::vector<const char *> &include_directories) const;
84
85  void Warn(const std::string &warn, bool show_exe_name = true) const;
86
87  void Error(const std::string &err, bool usage = true,
88             bool show_exe_name = true) const;
89
90  InitParams params_;
91};
92
93
94}  // namespace flatbuffers
95
96#endif  // FLATC_H_
97