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 PTraitBackendManager manager;
104 manager.addTraitBackend<CppTraitFromString>();
105 manager.addTraitBackend<CppTraitCopy>();
106 manager.addTraitBackend<CppTraitSetter>();
107 manager.addTraitBackend<CppTraitGetter>();
108 manager.addTraitBackend<CppTraitTypeStream>();
109 manager.addTraitBackend<CppTraitDataStream>();
110 manager.addTraitBackend<CppTraitConfigStream>();
111 manager.addTraitBackend<CppTraitCheckStream>();
112 if(projectParam.configFile != ""){
113 if(className == ""){
114 className = projectParam.configFile.getFileName().eraseExtension();
115 }
116 classMode.getValue(projectParam.name, "projectname");
117
118 PDataConfig dataConfig;
119 dataConfig.setFileName(projectParam.configFile);
120 if(!parserClassConfig(dataConfig.getVecClassConfig(), dataConfig.getVecInclude(), projectParam.configFile)){
121 std::cerr << "createClass : unexisting configuration file '"<<projectParam.configFile<<"'" << std::endl;
122 return false;
123 }
124 projectParam.vecDataConfig.push_back(dataConfig);
125 if(!generator_class_full(manager, projectParam)){
126 std::cerr << "createClass : can't save file '"<<className<<"'[.h or .cpp] with configuration file '"<<projectParam.configFile<<"'" << std::endl;
127 return false;
128 }
129 }else{
130 if(className == ""){
131 std::cerr << "createClass : cannot create class with empty name" << std::endl;
132 return false;
133 }
134 PVecClassConfig vecClassConfig;
135 PClassConfig classConfig;
136 classConfig.setName(className);
137
138 classConfig.setListTemplate(templatedef);
139
140 vecClassConfig.push_back(classConfig);
141 if(!generator_class_cpp(manager, vecClassConfig, projectParam.outputSourceDir, className, projectParam.mode, PVecPath())){
142 std::cerr << "createClass : can't save file '"<<className<<"'[.h or .cpp]" << std::endl;
143 return false;
144 }
145 }
146 return true;
147}
148
150
153bool createHeaderSource(const OptionMode & sourceMode){
154 PPath headerName("header");
155 sourceMode.getValue(headerName, "name");
156 PPath baseHeaderName(headerName.eraseExtension());
157 saveHeaderSourceFile(PPath(baseHeaderName + ".h"), PPath(baseHeaderName + ".cpp"));
158 return true;
159}
160
162
165bool createProjectSource(const OptionMode & projectMode){
166 PPath descriptionFile;
167 PVecPath vecConfigFile;
168 PString projectType;
169 projectMode.getValue(vecConfigFile, "config");
170 projectMode.getValue(descriptionFile, "description");
171 projectMode.getValue(projectType, "type");
172
173 GeneratorMode mode;
174 mode.enableDataStream = projectMode.isOptionExist("datastream");
175 mode.enableTypeStream = projectMode.isOptionExist("typestream");
176 mode.enableConfigStream = projectMode.isOptionExist("configstream");
177 mode.enableCheckStream = projectMode.isOptionExist("checkstream");
178 mode.enableUnitTest = projectMode.isOptionExist("tests");
179
180 return simple_project_generator(descriptionFile, vecConfigFile, projectType, mode);
181}
182
183int main(int argc, char** argv){
184 OptionParser parser = createOptionParser();
185 parser.parseArgument(argc, argv);
186
187 const OptionMode & classMode = parser.getMode("class");
188 const OptionMode & sourceMode = parser.getMode("source");
189 const OptionMode & projectMode = parser.getMode("project");
190 bool b(true);
191 if(classMode.isParsed()){ //We are using the class mode
192 b &= createClass(classMode);
193 }
194 if(sourceMode.isParsed()){ //We are using the source mode
195 b &= createHeaderSource(sourceMode);
196 }
197 if(projectMode.isParsed()){ //We are using the project mode
198 b &= createProjectSource(projectMode);
199 }
200 return b - 1;
201}
202
203
204
int main(int argc, char **argv)
Definition main.cpp:183
bool createProjectSource(const OptionMode &projectMode)
Create project.
Definition main.cpp:165
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:153