1ca0551cfSopenharmony_ci/*
2ca0551cfSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
3ca0551cfSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4ca0551cfSopenharmony_ci * you may not use this file except in compliance with the License.
5ca0551cfSopenharmony_ci * You may obtain a copy of the License at
6ca0551cfSopenharmony_ci *
7ca0551cfSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8ca0551cfSopenharmony_ci *
9ca0551cfSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10ca0551cfSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11ca0551cfSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12ca0551cfSopenharmony_ci * See the License for the specific language governing permissions and
13ca0551cfSopenharmony_ci * limitations under the License.
14ca0551cfSopenharmony_ci */
15ca0551cfSopenharmony_ci
16ca0551cfSopenharmony_ci#ifndef OHOS_IDL_OPTION_H
17ca0551cfSopenharmony_ci#define OHOS_IDL_OPTION_H
18ca0551cfSopenharmony_ci
19ca0551cfSopenharmony_ci#include <map>
20ca0551cfSopenharmony_ci#include <string>
21ca0551cfSopenharmony_ci#include <unordered_map>
22ca0551cfSopenharmony_ci#include <set>
23ca0551cfSopenharmony_ci
24ca0551cfSopenharmony_ci#include "util/common.h"
25ca0551cfSopenharmony_ci
26ca0551cfSopenharmony_cinamespace OHOS {
27ca0551cfSopenharmony_cinamespace Idl {
28ca0551cfSopenharmony_ciclass Options {
29ca0551cfSopenharmony_cipublic:
30ca0551cfSopenharmony_ci    using PkgPathMap = std::unordered_map<std::string, std::string>;
31ca0551cfSopenharmony_ci
32ca0551cfSopenharmony_ci    static Options &GetInstance();
33ca0551cfSopenharmony_ci
34ca0551cfSopenharmony_ci    Options(const Options &other) = delete;
35ca0551cfSopenharmony_ci    Options operator=(const Options &other) = delete;
36ca0551cfSopenharmony_ci
37ca0551cfSopenharmony_ci    bool Parse(int argc, char *argv[]);
38ca0551cfSopenharmony_ci
39ca0551cfSopenharmony_ci    ~Options() = default;
40ca0551cfSopenharmony_ci
41ca0551cfSopenharmony_ci    struct Attribute {
42ca0551cfSopenharmony_ci        Attribute() : doHitrace(false), doLog(false) {}
43ca0551cfSopenharmony_ci        std::string hitraceTag;
44ca0551cfSopenharmony_ci        std::string logTag;
45ca0551cfSopenharmony_ci        std::string domainId;
46ca0551cfSopenharmony_ci        bool doHitrace;
47ca0551cfSopenharmony_ci        bool doLog;
48ca0551cfSopenharmony_ci    };
49ca0551cfSopenharmony_ci
50ca0551cfSopenharmony_ci    inline bool DoShowUsage() const
51ca0551cfSopenharmony_ci    {
52ca0551cfSopenharmony_ci        return doShowUsage;
53ca0551cfSopenharmony_ci    }
54ca0551cfSopenharmony_ci
55ca0551cfSopenharmony_ci    inline bool DoShowVersion() const
56ca0551cfSopenharmony_ci    {
57ca0551cfSopenharmony_ci        return doShowVersion;
58ca0551cfSopenharmony_ci    }
59ca0551cfSopenharmony_ci
60ca0551cfSopenharmony_ci    inline bool DoCompile() const
61ca0551cfSopenharmony_ci    {
62ca0551cfSopenharmony_ci        return doCompile;
63ca0551cfSopenharmony_ci    }
64ca0551cfSopenharmony_ci
65ca0551cfSopenharmony_ci    inline bool DoDumpAST() const
66ca0551cfSopenharmony_ci    {
67ca0551cfSopenharmony_ci        return doDumpAST;
68ca0551cfSopenharmony_ci    }
69ca0551cfSopenharmony_ci
70ca0551cfSopenharmony_ci    inline bool DoDumpMetadata() const
71ca0551cfSopenharmony_ci    {
72ca0551cfSopenharmony_ci        return doDumpMetadata;
73ca0551cfSopenharmony_ci    }
74ca0551cfSopenharmony_ci
75ca0551cfSopenharmony_ci    inline bool DoSaveMetadata() const
76ca0551cfSopenharmony_ci    {
77ca0551cfSopenharmony_ci        return doSaveMetadata;
78ca0551cfSopenharmony_ci    }
79ca0551cfSopenharmony_ci
80ca0551cfSopenharmony_ci    inline bool DoGetHashKey() const
81ca0551cfSopenharmony_ci    {
82ca0551cfSopenharmony_ci        return doHashKey;
83ca0551cfSopenharmony_ci    }
84ca0551cfSopenharmony_ci
85ca0551cfSopenharmony_ci    inline bool DoGenerateCode() const
86ca0551cfSopenharmony_ci    {
87ca0551cfSopenharmony_ci        return doGenerateCode;
88ca0551cfSopenharmony_ci    }
89ca0551cfSopenharmony_ci
90ca0551cfSopenharmony_ci    inline bool DoGenerateKernelCode() const
91ca0551cfSopenharmony_ci    {
92ca0551cfSopenharmony_ci        return genMode == GenMode::KERNEL;
93ca0551cfSopenharmony_ci    }
94ca0551cfSopenharmony_ci
95ca0551cfSopenharmony_ci    inline bool DoPassthrough() const
96ca0551cfSopenharmony_ci    {
97ca0551cfSopenharmony_ci        return genMode == GenMode::PASSTHROUGH;
98ca0551cfSopenharmony_ci    }
99ca0551cfSopenharmony_ci
100ca0551cfSopenharmony_ci    inline std::set<std::string> GetSourceFiles() const
101ca0551cfSopenharmony_ci    {
102ca0551cfSopenharmony_ci        return sourceFiles;
103ca0551cfSopenharmony_ci    }
104ca0551cfSopenharmony_ci
105ca0551cfSopenharmony_ci    inline std::string GetMetadataFile() const
106ca0551cfSopenharmony_ci    {
107ca0551cfSopenharmony_ci        return metadataFile;
108ca0551cfSopenharmony_ci    }
109ca0551cfSopenharmony_ci
110ca0551cfSopenharmony_ci    inline PkgPathMap GetPackagePathMap() const
111ca0551cfSopenharmony_ci    {
112ca0551cfSopenharmony_ci        return packagePathMap;
113ca0551cfSopenharmony_ci    }
114ca0551cfSopenharmony_ci
115ca0551cfSopenharmony_ci    inline std::string GetPackage() const
116ca0551cfSopenharmony_ci    {
117ca0551cfSopenharmony_ci        return idlPackage;
118ca0551cfSopenharmony_ci    }
119ca0551cfSopenharmony_ci
120ca0551cfSopenharmony_ci    inline std::string GetGenerationDirectory() const
121ca0551cfSopenharmony_ci    {
122ca0551cfSopenharmony_ci        return genDir;
123ca0551cfSopenharmony_ci    }
124ca0551cfSopenharmony_ci
125ca0551cfSopenharmony_ci    inline std::string GetOutPutFile() const
126ca0551cfSopenharmony_ci    {
127ca0551cfSopenharmony_ci        return outPutFile;
128ca0551cfSopenharmony_ci    }
129ca0551cfSopenharmony_ci
130ca0551cfSopenharmony_ci    bool HasErrors() const;
131ca0551cfSopenharmony_ci
132ca0551cfSopenharmony_ci    void ShowErrors() const;
133ca0551cfSopenharmony_ci
134ca0551cfSopenharmony_ci    bool HasWarning() const;
135ca0551cfSopenharmony_ci
136ca0551cfSopenharmony_ci    void ShowWarning() const;
137ca0551cfSopenharmony_ci
138ca0551cfSopenharmony_ci    void ShowVersion() const;
139ca0551cfSopenharmony_ci
140ca0551cfSopenharmony_ci    void ShowUsage() const;
141ca0551cfSopenharmony_ci
142ca0551cfSopenharmony_ci    bool DoLogOn() const;
143ca0551cfSopenharmony_ci
144ca0551cfSopenharmony_ci    bool DoLegalLog() const;
145ca0551cfSopenharmony_ci
146ca0551cfSopenharmony_ci    std::string GetRootPackage(const std::string &package) const;
147ca0551cfSopenharmony_ci
148ca0551cfSopenharmony_ci    std::string GetRootPath(const std::string &package) const;
149ca0551cfSopenharmony_ci
150ca0551cfSopenharmony_ci    std::string GetSubPackage(const std::string &package) const;
151ca0551cfSopenharmony_ci
152ca0551cfSopenharmony_ci    std::string GetPackagePath(const std::string &package) const;
153ca0551cfSopenharmony_ci
154ca0551cfSopenharmony_ci    std::string GetImportFilePath(const std::string &import) const;
155ca0551cfSopenharmony_ci
156ca0551cfSopenharmony_ci    inline SystemLevel GetSystemLevel() const
157ca0551cfSopenharmony_ci    {
158ca0551cfSopenharmony_ci        return systemLevel;
159ca0551cfSopenharmony_ci    }
160ca0551cfSopenharmony_ci
161ca0551cfSopenharmony_ci    inline GenMode GetGenMode() const
162ca0551cfSopenharmony_ci    {
163ca0551cfSopenharmony_ci        return genMode;
164ca0551cfSopenharmony_ci    }
165ca0551cfSopenharmony_ci
166ca0551cfSopenharmony_ci    inline Language GetLanguage() const
167ca0551cfSopenharmony_ci    {
168ca0551cfSopenharmony_ci        return genLanguage;
169ca0551cfSopenharmony_ci    }
170ca0551cfSopenharmony_ci
171ca0551cfSopenharmony_ci    inline bool DoHitraceState() const
172ca0551cfSopenharmony_ci    {
173ca0551cfSopenharmony_ci        return doHitrace;
174ca0551cfSopenharmony_ci    }
175ca0551cfSopenharmony_ci
176ca0551cfSopenharmony_ci    inline bool DoSearchKeywords() const
177ca0551cfSopenharmony_ci    {
178ca0551cfSopenharmony_ci        return doKeywords;
179ca0551cfSopenharmony_ci    }
180ca0551cfSopenharmony_ci
181ca0551cfSopenharmony_ci    inline std::string GetGenerateHitraceTag() const
182ca0551cfSopenharmony_ci    {
183ca0551cfSopenharmony_ci        return hitraceTag;
184ca0551cfSopenharmony_ci    }
185ca0551cfSopenharmony_ci
186ca0551cfSopenharmony_ci    inline std::string GetDomainId() const
187ca0551cfSopenharmony_ci    {
188ca0551cfSopenharmony_ci        return domainId;
189ca0551cfSopenharmony_ci    }
190ca0551cfSopenharmony_ci
191ca0551cfSopenharmony_ci    inline std::string GetLogTag() const
192ca0551cfSopenharmony_ci    {
193ca0551cfSopenharmony_ci        return logTag;
194ca0551cfSopenharmony_ci    }
195ca0551cfSopenharmony_ci
196ca0551cfSopenharmony_ci    inline Attribute GetAttribute() const
197ca0551cfSopenharmony_ci    {
198ca0551cfSopenharmony_ci        return attribute;
199ca0551cfSopenharmony_ci    }
200ca0551cfSopenharmony_ci
201ca0551cfSopenharmony_ci    inline InterfaceType GetInterfaceType() const
202ca0551cfSopenharmony_ci    {
203ca0551cfSopenharmony_ci        return interfaceType;
204ca0551cfSopenharmony_ci    }
205ca0551cfSopenharmony_ciprivate:
206ca0551cfSopenharmony_ci    Options()
207ca0551cfSopenharmony_ci        : program(),
208ca0551cfSopenharmony_ci        systemLevel(SystemLevel::INIT),
209ca0551cfSopenharmony_ci        genMode(GenMode::INIT),
210ca0551cfSopenharmony_ci        genLanguage(Language::CPP),
211ca0551cfSopenharmony_ci        idlPackage(),
212ca0551cfSopenharmony_ci        sourceFiles(),
213ca0551cfSopenharmony_ci        genDir(),
214ca0551cfSopenharmony_ci        packagePathMap(),
215ca0551cfSopenharmony_ci        outPutFile(),
216ca0551cfSopenharmony_ci        attribute(Attribute()),
217ca0551cfSopenharmony_ci        doShowUsage(false),
218ca0551cfSopenharmony_ci        doShowVersion(false),
219ca0551cfSopenharmony_ci        doCompile(false),
220ca0551cfSopenharmony_ci        doDumpAST(false),
221ca0551cfSopenharmony_ci        doDumpMetadata(false),
222ca0551cfSopenharmony_ci        doHashKey(false),
223ca0551cfSopenharmony_ci        doGenerateCode(false),
224ca0551cfSopenharmony_ci        doOutDir(false),
225ca0551cfSopenharmony_ci        doKeywords(false),
226ca0551cfSopenharmony_ci        doSaveMetadata(false),
227ca0551cfSopenharmony_ci        doHitrace(false),
228ca0551cfSopenharmony_ci        interfaceType(InterfaceType::SA)
229ca0551cfSopenharmony_ci    {
230ca0551cfSopenharmony_ci    }
231ca0551cfSopenharmony_ci
232ca0551cfSopenharmony_ci    void SetLongOption(char op);
233ca0551cfSopenharmony_ci
234ca0551cfSopenharmony_ci    bool SetSystemLevel(const std::string &system);
235ca0551cfSopenharmony_ci
236ca0551cfSopenharmony_ci    bool SetGenerateMode(const std::string &mode);
237ca0551cfSopenharmony_ci
238ca0551cfSopenharmony_ci    bool SetLanguage(const std::string &language);
239ca0551cfSopenharmony_ci
240ca0551cfSopenharmony_ci    void SetPackage(const std::string &package);
241ca0551cfSopenharmony_ci
242ca0551cfSopenharmony_ci    bool AddPackagePath(const std::string &packagePath);
243ca0551cfSopenharmony_ci
244ca0551cfSopenharmony_ci    void AddSources(const std::string &sourceFile);
245ca0551cfSopenharmony_ci
246ca0551cfSopenharmony_ci    void AddSourcesByDir(const std::string &dir);
247ca0551cfSopenharmony_ci
248ca0551cfSopenharmony_ci    void SetOutDir(const std::string &dir);
249ca0551cfSopenharmony_ci
250ca0551cfSopenharmony_ci    void SetCodePart(const std::string &part);
251ca0551cfSopenharmony_ci
252ca0551cfSopenharmony_ci    bool DoLegalParam(const std::string &tag);
253ca0551cfSopenharmony_ci
254ca0551cfSopenharmony_ci    bool SetHiTrace(const std::string &tag);
255ca0551cfSopenharmony_ci
256ca0551cfSopenharmony_ci    bool SetLogDomainId(const std::string &id);
257ca0551cfSopenharmony_ci
258ca0551cfSopenharmony_ci    bool SetLogTag(const std::string &id);
259ca0551cfSopenharmony_ci
260ca0551cfSopenharmony_ci    bool SetInterfaceType(const std::string &type);
261ca0551cfSopenharmony_ci
262ca0551cfSopenharmony_ci    bool DoSupportHdiType();
263ca0551cfSopenharmony_ci
264ca0551cfSopenharmony_ci    bool DoSupportSmType();
265ca0551cfSopenharmony_ci
266ca0551cfSopenharmony_ci    void SetSmDefaultOption();
267ca0551cfSopenharmony_ci
268ca0551cfSopenharmony_ci    bool CheckSmOptions();
269ca0551cfSopenharmony_ci
270ca0551cfSopenharmony_ci    bool DoSupportSaType();
271ca0551cfSopenharmony_ci
272ca0551cfSopenharmony_ci    bool CheckHdiOptions();
273ca0551cfSopenharmony_ci
274ca0551cfSopenharmony_ci    void SetHdiDefaultOption();
275ca0551cfSopenharmony_ci
276ca0551cfSopenharmony_ci    bool CheckSaOptions();
277ca0551cfSopenharmony_ci
278ca0551cfSopenharmony_ci    bool SetMetadataFile(const std::string &metadataFile);
279ca0551cfSopenharmony_ci
280ca0551cfSopenharmony_ci    bool CheckOptions();
281ca0551cfSopenharmony_ci
282ca0551cfSopenharmony_ci    bool ParseSingle(int option, std::string optVal);
283ca0551cfSopenharmony_ci
284ca0551cfSopenharmony_ci    bool ParseOptionWithValue(int option, std::string optVal);
285ca0551cfSopenharmony_ci
286ca0551cfSopenharmony_ci    static const char *optSupportArgs;
287ca0551cfSopenharmony_ci
288ca0551cfSopenharmony_ci    static constexpr int VERSION_MAJOR  = 1;
289ca0551cfSopenharmony_ci    static constexpr int VERSION_MINOR = 0;
290ca0551cfSopenharmony_ci
291ca0551cfSopenharmony_ci    std::string program;
292ca0551cfSopenharmony_ci    SystemLevel systemLevel;
293ca0551cfSopenharmony_ci    GenMode genMode;
294ca0551cfSopenharmony_ci    Language genLanguage;
295ca0551cfSopenharmony_ci    std::string idlPackage;
296ca0551cfSopenharmony_ci    std::string sourceDir; // '-D <directory>'
297ca0551cfSopenharmony_ci    std::set<std::string> sourceFiles; // '-c <*.idl>'
298ca0551cfSopenharmony_ci    std::string genDir; // '-d <directory>'
299ca0551cfSopenharmony_ci    PkgPathMap packagePathMap;
300ca0551cfSopenharmony_ci    std::string outPutFile;
301ca0551cfSopenharmony_ci    std::string hitraceTag;
302ca0551cfSopenharmony_ci    std::string domainId;
303ca0551cfSopenharmony_ci    std::string logTag;
304ca0551cfSopenharmony_ci    std::string metadataFile;
305ca0551cfSopenharmony_ci    Attribute attribute;
306ca0551cfSopenharmony_ci    std::string illegalOptions;
307ca0551cfSopenharmony_ci
308ca0551cfSopenharmony_ci    bool doShowUsage;
309ca0551cfSopenharmony_ci    bool doShowVersion; // '-v'
310ca0551cfSopenharmony_ci    bool doCompile; // '-c'
311ca0551cfSopenharmony_ci    bool doDumpAST;
312ca0551cfSopenharmony_ci    bool doDumpMetadata;
313ca0551cfSopenharmony_ci    bool doHashKey;
314ca0551cfSopenharmony_ci    bool doGenerateCode;
315ca0551cfSopenharmony_ci    bool doOutDir; // '-d'
316ca0551cfSopenharmony_ci    bool doKeywords; // "-t" "-log-.."
317ca0551cfSopenharmony_ci    bool doSaveMetadata;
318ca0551cfSopenharmony_ci    bool doHitrace;
319ca0551cfSopenharmony_ci    InterfaceType interfaceType;
320ca0551cfSopenharmony_ci};
321ca0551cfSopenharmony_ci} // namespace Idl
322ca0551cfSopenharmony_ci} // namespace OHOS
323ca0551cfSopenharmony_ci
324ca0551cfSopenharmony_ci#endif // OHOS_HDIL_OPTION_H