1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  *
4  * HDF is dual licensed: you can use it either under the terms of
5  * the GPL, or the BSD license, at your option.
6  * See the LICENSE file in the root of this repository for complete details.
7  */
8 
9 #ifndef OHOS_HDI_OPTION_H
10 #define OHOS_HDI_OPTION_H
11 
12 #include <map>
13 #include <string>
14 #include <unordered_map>
15 #include <set>
16 
17 #include "util/common.h"
18 
19 namespace OHOS {
20 namespace HDI {
21 class Options {
22 public:
23     using PkgPathMap = std::unordered_map<std::string, std::string>;
24 
25     static Options &GetInstance();
26 
27     Options(const Options &other) = delete;
28     Options operator=(const Options &other) = delete;
29 
30     bool Parse(int argc, char *argv[]);
31 
32     ~Options() = default;
33 
DoShowUsage()34     inline bool DoShowUsage() const
35     {
36         return doShowUsage;
37     }
38 
DoShowVersion()39     inline bool DoShowVersion() const
40     {
41         return doShowVersion;
42     }
43 
DoCompile()44     inline bool DoCompile() const
45     {
46         return doCompile;
47     }
48 
DoDumpAST()49     inline bool DoDumpAST() const
50     {
51         return doDumpAST;
52     }
53 
DoGetHashKey()54     inline bool DoGetHashKey() const
55     {
56         return doHashKey;
57     }
58 
DoGenerateCode()59     inline bool DoGenerateCode() const
60     {
61         return doGenerateCode;
62     }
63 
DoGenerateKernelCode()64     inline bool DoGenerateKernelCode() const
65     {
66         return genMode == GenMode::KERNEL;
67     }
68 
DoPassthrough()69     inline bool DoPassthrough() const
70     {
71         return genMode == GenMode::PASSTHROUGH;
72     }
73 
GetSourceFiles()74     inline std::set<std::string> GetSourceFiles() const
75     {
76         return sourceFiles;
77     }
78 
GetPackagePathMap()79     inline PkgPathMap GetPackagePathMap() const
80     {
81         return packagePathMap;
82     }
83 
GetPackage()84     inline std::string GetPackage() const
85     {
86         return idlPackage;
87     }
88 
GetGenerationDirectory()89     inline std::string GetGenerationDirectory() const
90     {
91         return genDir;
92     }
93 
GetOutPutFile()94     inline std::string GetOutPutFile() const
95     {
96         return outPutFile;
97     }
98 
99     void ShowVersion() const;
100 
101     void ShowUsage() const;
102 
103     std::string GetRootPackage(const std::string &package) const;
104 
105     std::string GetRootPath(const std::string &package) const;
106 
107     std::string GetSubPackage(const std::string &package) const;
108 
109     std::string GetPackagePath(const std::string &package) const;
110 
111     std::string GetImportFilePath(const std::string &import) const;
112 
GetSystemLevel()113     inline SystemLevel GetSystemLevel() const
114     {
115         return systemLevel;
116     }
117 
GetGenMode()118     inline GenMode GetGenMode() const
119     {
120         return genMode;
121     }
122 
GetLanguage()123     inline Language GetLanguage() const
124     {
125         return genLanguage;
126     }
127 
128 private:
Options()129     Options()
130         : program(),
131         systemLevel(SystemLevel::FULL),
132         genMode(GenMode::IPC),
133         genLanguage(Language::CPP),
134         idlPackage(),
135         sourceFiles(),
136         genDir(),
137         packagePathMap(),
138         outPutFile(),
139         doShowUsage(false),
140         doShowVersion(false),
141         doCompile(false),
142         doDumpAST(false),
143         doHashKey(false),
144         doGenerateCode(false),
145         doOutDir(false)
146     {
147     }
148 
149     void SetLongOption(char op);
150 
151     bool SetSystemLevel(const std::string &system);
152 
153     bool SetGenerateMode(const std::string &mode);
154 
155     bool SetLanguage(const std::string &language);
156 
157     void SetPackage(const std::string &package);
158 
159     bool AddPackagePath(const std::string &packagePath);
160 
161     void AddSources(const std::string &sourceFile);
162 
163     std::string CheckOutPutFile(const std::string &sourceFile);
164 
165     void AddSourcesByDir(const std::string &dir);
166 
167     void SetOutDir(const std::string &dir);
168 
169     void SetCodePart(const std::string &part);
170 
171     bool CheckOptions();
172 
173     static const char *optSupportArgs;
174     static constexpr int OPT_END = -1;
175 
176     static constexpr int VERSION_MAJOR = 1;
177     static constexpr int VERSION_MINOR = 0;
178 
179     std::string program;
180     SystemLevel systemLevel;
181     GenMode genMode;
182     Language genLanguage;
183     std::string idlPackage;
184     std::set<std::string> sourceFiles;
185     std::string genDir;
186     PkgPathMap packagePathMap;
187     std::string outPutFile;
188     bool doShowUsage;
189     bool doShowVersion;
190     bool doCompile;
191     bool doDumpAST;
192     bool doHashKey;
193     bool doGenerateCode;
194     bool doOutDir;
195 };
196 } // namespace HDI
197 } // namespace OHOS
198 
199 #endif // OHOS_HDIL_OPTION_H