]> git.tdb.fi Git - libs/game.git/blob - tools/setupgen/setupgen.h
Support API decorations for setups
[libs/game.git] / tools / setupgen / setupgen.h
1 #ifndef SETUPGEN_H_
2 #define SETUPGEN_H_
3
4 #include <list>
5 #include <map>
6 #include <memory>
7 #include <set>
8 #include <string>
9 #include <msp/core/application.h>
10 #include <msp/datafile/objectloader.h>
11 #include <msp/fs/path.h>
12 #include "enum.h"
13 #include "struct.h"
14 #include "type.h"
15
16 class SetupGen: public Msp::RegisteredApplication<SetupGen>
17 {
18 private:
19         struct Module
20         {
21                 std::string name_space;
22                 std::string api;
23                 std::string api_header;
24                 std::vector<std::unique_ptr<Enum>> enums;
25                 std::vector<std::unique_ptr<Struct>> structs;
26         };
27
28         class Loader: public Msp::DataFile::ObjectLoader<SetupGen>
29         {
30         private:
31                 Module &mod;
32
33         public:
34                 Loader(SetupGen &, Module &);
35
36         private:
37                 void init_actions() override;
38
39                 void api(const std::string &);
40                 void api_with_header(const std::string &, const std::string &);
41                 void enum_def(const Msp::DataFile::Symbol &);
42                 void import(const std::string &);
43                 void name_space(const std::string &);
44                 void struct_def(Struct::Kind, const Msp::DataFile::Symbol &);
45         };
46
47         std::string in_fn;
48         std::string out_fn;
49         std::vector<Msp::FS::Path> import_path;
50         std::list<Module> modules;
51         std::map<std::string, Type> types;
52         std::vector<std::unique_ptr<Enum>> enums;
53         std::vector<std::unique_ptr<Struct>> structs;
54         std::set<std::string> headers;
55
56 public:
57         SetupGen(int, char **);
58
59         int main() override;
60 private:
61         void create_standard_types();
62         Type &add_type(const std::string &, Type::Kind);
63 public:
64         const Type &get_type(const std::string &) const;
65
66 private:
67         void load(const Msp::FS::Path &);
68         void collect_headers(const Module &);
69         void generate_header(const Module &, Msp::IO::Base &) const;
70         void generate_code(const Module &, Msp::IO::Base &) const;
71 };
72
73 #endif