1ca0551cfSopenharmony_ci/*
2ca0551cfSopenharmony_ci * Copyright (c) 2022 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#include "codegen/code_generator.h"
17ca0551cfSopenharmony_ci#include "metadata/metadata_builder.h"
18ca0551cfSopenharmony_ci#include "metadata/metadata_dumper.h"
19ca0551cfSopenharmony_ci#include "metadata/metadata_reader.h"
20ca0551cfSopenharmony_ci#include "metadata/metadata_serializer.h"
21ca0551cfSopenharmony_ci#include "parser/parser.h"
22ca0551cfSopenharmony_ci#include "util/logger.h"
23ca0551cfSopenharmony_ci#include "util/options.h"
24ca0551cfSopenharmony_ci
25ca0551cfSopenharmony_ciusing namespace OHOS::Idl;
26ca0551cfSopenharmony_ci
27ca0551cfSopenharmony_cistatic const char* TAG = "idl";
28ca0551cfSopenharmony_ci
29ca0551cfSopenharmony_cistatic int DoOptionsCheck(Options& options)
30ca0551cfSopenharmony_ci{
31ca0551cfSopenharmony_ci    if (options.DoShowUsage()) {
32ca0551cfSopenharmony_ci        options.ShowUsage();
33ca0551cfSopenharmony_ci        return 0;
34ca0551cfSopenharmony_ci    }
35ca0551cfSopenharmony_ci
36ca0551cfSopenharmony_ci    if (options.DoShowVersion()) {
37ca0551cfSopenharmony_ci        options.ShowVersion();
38ca0551cfSopenharmony_ci        return 0;
39ca0551cfSopenharmony_ci    }
40ca0551cfSopenharmony_ci
41ca0551cfSopenharmony_ci    if (options.HasErrors()) {
42ca0551cfSopenharmony_ci        options.ShowErrors();
43ca0551cfSopenharmony_ci        return 0;
44ca0551cfSopenharmony_ci    }
45ca0551cfSopenharmony_ci
46ca0551cfSopenharmony_ci    if (options.GetTargetLanguage().Equals("rust") ||
47ca0551cfSopenharmony_ci        options.GetTargetLanguage().Equals("ts")) {
48ca0551cfSopenharmony_ci        if (options.DoSearchKeywords()) {
49ca0551cfSopenharmony_ci            options.ShowWarning();
50ca0551cfSopenharmony_ci        }
51ca0551cfSopenharmony_ci    }
52ca0551cfSopenharmony_ci    return 1;
53ca0551cfSopenharmony_ci}
54ca0551cfSopenharmony_ci
55ca0551cfSopenharmony_cistatic int DoCompile(Options& options, std::shared_ptr<MetaComponent>& metadata)
56ca0551cfSopenharmony_ci{
57ca0551cfSopenharmony_ci    if (options.DoCompile()) {
58ca0551cfSopenharmony_ci        Parser parser(options);
59ca0551cfSopenharmony_ci        if (!parser.Parse(options.GetSourceFile())) {
60ca0551cfSopenharmony_ci            Logger::E(TAG, "Parsing .idl failed.");
61ca0551cfSopenharmony_ci            return -1;
62ca0551cfSopenharmony_ci        }
63ca0551cfSopenharmony_ci
64ca0551cfSopenharmony_ci        MetadataBuilder builder(parser.GetModule());
65ca0551cfSopenharmony_ci        metadata = builder.Build();
66ca0551cfSopenharmony_ci        if (metadata == nullptr) {
67ca0551cfSopenharmony_ci            Logger::E(TAG, "Generate metadata failed.");
68ca0551cfSopenharmony_ci            return -1;
69ca0551cfSopenharmony_ci        }
70ca0551cfSopenharmony_ci    }
71ca0551cfSopenharmony_ci
72ca0551cfSopenharmony_ci    if (options.DoDumpMetadata()) {
73ca0551cfSopenharmony_ci        MetadataDumper dumper(metadata.get());
74ca0551cfSopenharmony_ci        dumper.Dump("");
75ca0551cfSopenharmony_ci    }
76ca0551cfSopenharmony_ci
77ca0551cfSopenharmony_ci    if (options.DoSaveMetadata()) {
78ca0551cfSopenharmony_ci        File metadataFile(options.GetMetadataFile(), File::WRITE);
79ca0551cfSopenharmony_ci        if (!metadataFile.IsValid()) {
80ca0551cfSopenharmony_ci            Logger::E(TAG, "Create metadata file failed.");
81ca0551cfSopenharmony_ci            return -1;
82ca0551cfSopenharmony_ci        }
83ca0551cfSopenharmony_ci
84ca0551cfSopenharmony_ci        MetadataSerializer serializer(metadata.get());
85ca0551cfSopenharmony_ci        serializer.Serialize();
86ca0551cfSopenharmony_ci        uintptr_t data = serializer.GetData();
87ca0551cfSopenharmony_ci        int size = serializer.GetDataSize();
88ca0551cfSopenharmony_ci
89ca0551cfSopenharmony_ci        metadataFile.WriteData(reinterpret_cast<void*>(data), size);
90ca0551cfSopenharmony_ci        metadataFile.Flush();
91ca0551cfSopenharmony_ci        metadataFile.Close();
92ca0551cfSopenharmony_ci    }
93ca0551cfSopenharmony_ci    return 0;
94ca0551cfSopenharmony_ci}
95ca0551cfSopenharmony_ci
96ca0551cfSopenharmony_cistatic int DoGenerage(const Options& options, std::shared_ptr<MetaComponent>& metadata)
97ca0551cfSopenharmony_ci{
98ca0551cfSopenharmony_ci    if (options.DoGenerateCode()) {
99ca0551cfSopenharmony_ci        if (metadata == nullptr) {
100ca0551cfSopenharmony_ci            String metadataFile = options.GetMetadataFile();
101ca0551cfSopenharmony_ci            metadata = MetadataReader::ReadMetadataFromFile(metadataFile);
102ca0551cfSopenharmony_ci            if (metadata == nullptr) {
103ca0551cfSopenharmony_ci                Logger::E(TAG, "Get metadata from \"%s\" failed.", metadataFile.string());
104ca0551cfSopenharmony_ci                return -1;
105ca0551cfSopenharmony_ci            }
106ca0551cfSopenharmony_ci        }
107ca0551cfSopenharmony_ci
108ca0551cfSopenharmony_ci        CodeGenerator codeGen(metadata.get(), options.GetTargetLanguage(),
109ca0551cfSopenharmony_ci                options.GetGenerationDirectory(), options.GetAttribute());
110ca0551cfSopenharmony_ci        if (!codeGen.Generate()) {
111ca0551cfSopenharmony_ci            Logger::E(TAG, "Generate \"%s\" codes failed.", options.GetTargetLanguage().string());
112ca0551cfSopenharmony_ci            return -1;
113ca0551cfSopenharmony_ci        }
114ca0551cfSopenharmony_ci    }
115ca0551cfSopenharmony_ci    return 0;
116ca0551cfSopenharmony_ci}
117ca0551cfSopenharmony_ci
118ca0551cfSopenharmony_ciint main(int argc, char** argv)
119ca0551cfSopenharmony_ci{
120ca0551cfSopenharmony_ci    Options options(argc, argv);
121ca0551cfSopenharmony_ci    int checkOffRes = DoOptionsCheck(options);
122ca0551cfSopenharmony_ci    if (!checkOffRes) {
123ca0551cfSopenharmony_ci        return checkOffRes;
124ca0551cfSopenharmony_ci    }
125ca0551cfSopenharmony_ci
126ca0551cfSopenharmony_ci    std::shared_ptr<MetaComponent> metadata;
127ca0551cfSopenharmony_ci    int compileRes = DoCompile(options, metadata);
128ca0551cfSopenharmony_ci    if (compileRes) {
129ca0551cfSopenharmony_ci        return compileRes;
130ca0551cfSopenharmony_ci    }
131ca0551cfSopenharmony_ci
132ca0551cfSopenharmony_ci    int generateRes = DoGenerage(options, metadata);
133ca0551cfSopenharmony_ci    if (generateRes) {
134ca0551cfSopenharmony_ci        return generateRes;
135ca0551cfSopenharmony_ci    }
136ca0551cfSopenharmony_ci
137ca0551cfSopenharmony_ci    return 0;
138ca0551cfSopenharmony_ci}
139