1/*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef OHOS_IDL_RUSTCODEEMITTER_H
17#define OHOS_IDL_RUSTCODEEMITTER_H
18
19#include <string>
20
21#include "codegen/code_emitter.h"
22#include "util/string_builder.h"
23
24namespace OHOS {
25namespace Idl {
26class RustCodeEmitter : public CodeEmitter {
27public:
28    RustCodeEmitter(MetaComponent* mc)
29        : CodeEmitter(mc)
30    {}
31
32    void EmitInterface() override;
33
34    void EmitInterfaceProxy() override;
35
36    void EmitInterfaceStub() override;
37
38private:
39    void EmitInterface(StringBuilder& sb);
40
41    void EmitLicense(StringBuilder& sb);
42
43    void EmitMacros(StringBuilder& sb);
44
45    void EmitHeaders(StringBuilder& sb);
46
47    void EmitIPCHeaders(StringBuilder& sb);
48
49    void EmitCommonHeaders(StringBuilder& sb);
50
51    bool EmitCustomHeaders(StringBuilder& sb);
52
53    String TrimDot(const String& fpnp);
54
55    String GeneratePath(const String& fpnp);
56
57    bool AppendRealPath(StringBuilder& sb, const String& fpnp);
58
59    void AppendCommandEnums(StringBuilder& sb);
60
61    String GetCodeFromMethod(const char* name);
62
63    String GetNameFromParameter(const char* name);
64
65    void EmitCommandEnums(StringBuilder& sb);
66
67    void EmitCommands(StringBuilder& sb);
68
69    void EmitRemoteObject(StringBuilder& sb);
70
71    void EmitBrokers(StringBuilder& sb);
72
73    void WrapLine(StringBuilder& sb, int index, const String& prefix);
74
75    void AppendBrokerMethods(StringBuilder& sb);
76
77    void AppendBrokerParameters(StringBuilder& sb, MetaParameter* mp);
78
79    String ConvertType(MetaType* mt, bool pt = false);
80
81    void EmitRemoteRequest(StringBuilder& sb);
82
83    void ReadListFromParcel(StringBuilder& sb, MetaType* mt, const String& result,
84        const String& name, const String& prefix);
85
86    void ReadMapFromParcel(StringBuilder& sb, MetaType* mt, const String& result,
87        const String& name, const String& prefix);
88
89    void ReadFromParcel(StringBuilder& sb, MetaType* mt, const String& result,
90        const String& name, const String& prefix);
91
92    void WriteListToParcel(StringBuilder& sb, MetaType* mt, const String& result,
93        const String& name, const String& prefix);
94
95    void WriteMapToParcel(StringBuilder& sb, MetaType* mt, const String& result,
96        const String& name, const String& prefix);
97
98    void WriteToParcel(StringBuilder& sb, MetaType* mt, const String& result,
99        const String& name, const String& prefix);
100
101    void AddRemoteRequestMethods(StringBuilder& sb);
102
103    void AddRemoteRequestParameters(StringBuilder& sb, MetaMethod* mm);
104
105    void EmitStub(StringBuilder& sb);
106
107    void AppendStubMethods(StringBuilder& sb);
108
109    void AppendStubParameters(StringBuilder& sb, MetaMethod* mm);
110
111    void EmitProxy(StringBuilder& sb);
112
113    void AppendProxyMethods(StringBuilder& sb);
114};
115}
116}
117#endif
118