PhoenixFileGenerator  0.2.0
Set of tools to generate code
Loading...
Searching...
No Matches
main.cpp
Go to the documentation of this file.
1
2/***************************************
3 Auteur : Pierre Aubert
4 Mail : pierre.aubert@lapp.in2p3.fr
5 Licence : CeCILL-C
6****************************************/
7
8#include <iostream>
9
10#include "OptionParser.h"
11#include "header_generator.h"
12#include "parserClassConfig.h"
13#include "generator_class_cpp.h"
14#include "simple_project_generator.h"
15
16//C++ Trait Backend
17#include "CppTraitFromString.h"
18#include "CppTraitSetter.h"
19#include "CppTraitGetter.h"
20#include "CppTraitCopy.h"
21#include "CppTraitTypeStream.h"
22#include "CppTraitDataStream.h"
23#include "CppTraitConfigStream.h"
24#include "CppTraitCheckStream.h"
25
27
29OptionParser createOptionParser(){
30 OptionParser parser(true, __PROGRAM_VERSION__);
31 parser.setExampleLongOption("phoenix_filegenerator class --name=some_source");
32 parser.setExampleShortOption("phoenix_filegenerator class -n some_source");
33
34 //Class mode
35 parser.addMode("class");
36 PString defaultClassName("");
37 parser.addOption("name", "n", defaultClassName, "base name of the file to be created");
38 PVecString templateDef;
39 parser.addOption("template", "t", templateDef, "template definition of the class (ex: 'typename T' or 'typename T' 'typename U', etc)");
40 parser.addOption("config", "c", OptionType::FILENAME, false, "Configuration file to create a class (*.pdata)");
41 parser.addOption("datastream", "s", OptionType::NONE, false, "Enable PhoenixDataStream use to save/load generated class automatically");
42 parser.addOption("typestream", "y", OptionType::NONE, false, "Enable PhoenixTypeStream use to get the class name automatically");
43 parser.addOption("configstream", "f", OptionType::NONE, false, "Enable PhoenixConfigStream use to get the class name automatically");
44 parser.addOption("checkstream", "e", OptionType::NONE, false, "Enable PhoenixCheckStream use to get the class name automatically");
45 parser.addOption("tests", "u", OptionType::NONE, false, "Enable unit tests generation");
46 PString templateDir(".");
47 parser.addOption("testdir", "d", templateDir, "Directory for the unit tests");
48 parser.addOption("outputpath", "o", templateDir, "Path where the generated source files will be saved");
49 PString projectName("project_name");
50 parser.addOption("projectname", "r", projectName, "Name of the project to generate class in with unit test (will be used for unit test linking)");
51 parser.closeMode();
52
53 //Source mode
54 parser.addMode("source");
55 parser.addOption("name", "n", OptionType::STRING, true, "base name of the file to be created");
56 parser.closeMode();
57
58 //Project mode
59 parser.addMode("project");
60 parser.addOption("description", "d", OptionType::FILENAME, false, "description of the full project (*.toml)");
61 parser.addOption("config", "c", OptionType::FILENAME, false, "Configuration file to create a class (*.pdata)");
62 PString baseProjectType("SimpleCpp");
63 parser.addOption("type", "t", baseProjectType, "Type of the project to generate");
64 parser.addOption("pythonwrapper", "w", OptionType::NONE, false, "Enable python wrapper generation");
65 parser.addOption("datastream", "s", OptionType::NONE, false, "Enable PhoenixDataStream use to save/load generated class automatically");
66 parser.addOption("typestream", "y", OptionType::NONE, false, "Enable PhoenixTypeStream use to get the class name automatically");
67 parser.addOption("configstream", "f", OptionType::NONE, false, "Enable PhoenixConfigStream use to get the class name automatically");
68 parser.addOption("checkstream", "e", OptionType::NONE, false, "Enable PhoenixCheckStream use to get the class name automatically");
69 parser.addOption("tests", "u", OptionType::NONE, false, "Enable unit tests generation");
70 parser.closeMode();
71 return parser;
72}
73
75
78bool createClass(const OptionMode & classMode){
79 PString className;
80 PVecString templatedef;
81
82 ProjectParam projectParam;
83 projectParam.configFile = PPath("");
84 projectParam.outputTestDir = PPath("./");
85 projectParam.outputSourceDir = PPath("./");
86 classMode.getValue(className, "name");
87 classMode.getValue(projectParam.configFile, "config");
88 classMode.getValue(templatedef, "template");
89 classMode.getValue(projectParam.outputTestDir, "testdir");
90 classMode.getValue(projectParam.outputSourceDir, "outputpath");
91
92 GeneratorMode & mode = projectParam.mode;
93 mode.enableSetter = true;
94 mode.enableGetter = true;
95 mode.enableCopy = true;
96 mode.enableFromString = true;
97 mode.enableDataStream = classMode.isOptionExist("datastream");
98 mode.enableTypeStream = classMode.isOptionExist("typestream");
99 mode.enableConfigStream = classMode.isOptionExist("configstream");
100 mode.enableCheckStream = classMode.isOptionExist("checkstream");
101 mode.enableUnitTest = classMode.isOptionExist("tests");
102
103 if(classMode.isOptionExist("testdir") && !mode.enableUnitTest){
104 std::cerr << "createClass : testdir option is only available if tests option is enabled" << std::endl;
105 return false;
106 }
107
108 PTraitBackendManager manager;
109 manager.addTraitBackend<CppTraitFromString>();
110 manager.addTraitBackend<CppTraitCopy>();
111 manager.addTraitBackend<CppTraitSetter>();
112 manager.addTraitBackend<CppTraitGetter>();
113 manager.addTraitBackend<CppTraitTypeStream>();
114 manager.addTraitBackend<CppTraitDataStream>();
115 manager.addTraitBackend<CppTraitConfigStream>();
116 manager.addTraitBackend<CppTraitCheckStream>();
117 if(projectParam.configFile != ""){
118 if(className == ""){
119 className = projectParam.configFile.getFileName().eraseExtension();
120 }
121 classMode.getValue(projectParam.name, "projectname");
122
123 PDataConfig dataConfig;
124 dataConfig.setFileName(projectParam.configFile);
125 if(!parserClassConfig(dataConfig.getVecClassConfig(), dataConfig.getVecInclude(), projectParam.configFile)){
126 std::cerr << "createClass : unexisting configuration file '"<<projectParam.configFile<<"'" << std::endl;
127 return false;
128 }
129 if(!generator_class_cpp(manager, dataConfig.getVecClassConfig(), projectParam.outputSourceDir, className, projectParam.mode, dataConfig.getVecInclude())){
130 std::cerr << "createClass : can't save file '"<<className<<"'[.h or .cpp] with configuration file '"<<projectParam.configFile<<"'" << std::endl;
131 return false;
132 }
133 if(projectParam.mode.enableUnitTest){
134 if(!generator_class_cpp_test(manager, projectParam.outputTestDir, dataConfig.getVecClassConfig(), projectParam.name, dataConfig.getFileName().getFileName().eraseExtension(), projectParam.mode)){
135 std::cerr << "createClass : can't save unit test file for '"<<className<<"' with configuration file '"<<projectParam.configFile<<"'" << std::endl;
136 return false;
137 }
138 }
139 // projectParam.vecDataConfig.push_back(dataConfig);
140 // if(!generator_class_full(manager, projectParam)){
141 // std::cerr << "createClass : can't save file '"<<className<<"'[.h or .cpp] with configuration file '"<<projectParam.configFile<<"'" << std::endl;
142 // return false;
143 // }
144 }else{
145 if(className == ""){
146 std::cerr << "createClass : cannot create class with empty name" << std::endl;
147 return false;
148 }
149 PVecClassConfig vecClassConfig;
150 PClassConfig classConfig;
151 classConfig.setName(className);
152
153 classConfig.setListTemplate(templatedef);
154
155 vecClassConfig.push_back(classConfig);
156 if(!generator_class_cpp(manager, vecClassConfig, projectParam.outputSourceDir, className, projectParam.mode, PVecPath())){
157 std::cerr << "createClass : can't save file '"<<className<<"'[.h or .cpp]" << std::endl;
158 return false;
159 }
160 }
161 return true;
162}
163
165
168bool createHeaderSource(const OptionMode & sourceMode){
169 PPath headerName("header");
170 sourceMode.getValue(headerName, "name");
171 PPath baseHeaderName(headerName.eraseExtension());
172 saveHeaderSourceFile(PPath(baseHeaderName + ".h"), PPath(baseHeaderName + ".cpp"));
173 return true;
174}
175
177
180bool createProjectSource(const OptionMode & projectMode){
181 PPath descriptionFile;
182 PVecPath vecConfigFile;
183 PString projectType;
184 projectMode.getValue(vecConfigFile, "config");
185 projectMode.getValue(descriptionFile, "description");
186 projectMode.getValue(projectType, "type");
187
188 GeneratorMode mode;
189 mode.enableDataStream = projectMode.isOptionExist("datastream");
190 mode.enableTypeStream = projectMode.isOptionExist("typestream");
191 mode.enableConfigStream = projectMode.isOptionExist("configstream");
192 mode.enableCheckStream = projectMode.isOptionExist("checkstream");
193 mode.enableUnitTest = projectMode.isOptionExist("tests");
194
195 return simple_project_generator(descriptionFile, vecConfigFile, projectType, mode);
196}
197
198int main(int argc, char** argv){
199 OptionParser parser = createOptionParser();
200 parser.parseArgument(argc, argv);
201
202 const OptionMode & classMode = parser.getMode("class");
203 const OptionMode & sourceMode = parser.getMode("source");
204 const OptionMode & projectMode = parser.getMode("project");
205 bool b(true);
206 if(classMode.isParsed()){ //We are using the class mode
207 b &= createClass(classMode);
208 }
209 if(sourceMode.isParsed()){ //We are using the source mode
210 b &= createHeaderSource(sourceMode);
211 }
212 if(projectMode.isParsed()){ //We are using the project mode
213 b &= createProjectSource(projectMode);
214 }
215 return b - 1;
216}
217
218
219
int main(int argc, char **argv)
Definition main.cpp:198
bool createProjectSource(const OptionMode &projectMode)
Create project.
Definition main.cpp:180
bool createClass(const OptionMode &classMode)
Class creator.
Definition main.cpp:78
OptionParser createOptionParser()
Create the OptionParser of this program.
Definition main.cpp:29
bool createHeaderSource(const OptionMode &sourceMode)
Create header and source file name.
Definition main.cpp:168