TarsCloud_TarsCpp/tools/tars2cpp/tars2cpp.h
2020-04-02 18:57:36 +08:00

519 lines
11 KiB
C++
Executable File

/**
* Tencent is pleased to support the open source community by making Tars available.
*
* Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* https://opensource.org/licenses/BSD-3-Clause
*
* Unless required by applicable law or agreed to in writing, software distributed
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
#ifndef __TARS2CPP_H_
#define __TARS2CPP_H_
#include "parse.h"
#include <cassert>
#include <string>
using namespace tars;
/**
* 根据tars生成c++文件
* 包括结构的编解码以及生成Proxy和Servant
*/
class Tars2Cpp
{
public:
Tars2Cpp();
/**
* 生成
* @param file
*/
void createFile(const string &file);//, const vector<string> &vsCoder);
/**
* 设置生成文件的目录
*
*/
void setBaseDir(const std::string & sPath) { _baseDir = sPath; }
/**
* 设置是否需要打包默认值
*/
void setCheckDefault(bool bCheck) { _checkDefault = bCheck; }
/**
* 根据命令选项设置是否需要生成sql支持
*/
void setSqlSupport(bool bSqlSupport) { _bSqlSupport = bSqlSupport;}
/**
* 根据命令选项设置是否需要生成xml支持
*/
void setXmlSupport(bool bXmlSupport, const vector<string>& vXmlIntf)
{
_bXmlSupport = bXmlSupport;
_vXmlIntf = vXmlIntf;
}
/**
* 根据命令选项设置是否需要生成json支持
*/
void setJsonSupport(bool bJsonSupport) { _bJsonSupport = bJsonSupport; }
/**
* 根据命令选项设置是否需要生成json支持
*/
void setJsonSupport(const vector<string>& vJsonIntf) { _vJsonIntf = vJsonIntf; }
/**
* 设置是否只生成struct
*/
void setOnlyStruct(bool bOnlyStruct) { _onlyStruct = bOnlyStruct; }
/**
* setUnknownField for UnknownField support
*/
// void setUnknownField(bool bUnkownField) { _unknownField = bUnkownField; }
/**
* added for master info
*/
void setTarsMaster(bool bTarsMaster) { _tarsMaster = bTarsMaster; }
//下面是编解码的源码生成
protected:
/**
* 生成xml
* @param pPtr
*
* @return string
*/
string writeToXml(const TypeIdPtr &pPtr) const;
/**
* 生成xml
* @param pPtr
*
* @return string
*/
string readFromXml(const TypeIdPtr &pPtr, bool bIsRequire = true) const;
/**
* 生成sql
* @param pPtr
*
* @return string
*/
string writeToSql(const TypeIdPtr &pPtr) const;
/**
* 生成sql
* @param pPtr
*
* @return string
*/
string readFromSql(const TypeIdPtr &pPtr, bool bIsRequire = true) const;
/**
* 生成json
* @param pPtr
*
* @return string
*/
string writeToJson(const TypeIdPtr& pPtr) const;
/**
* 生成json
* @param pPtr
*
* @return string
*/
string readFromJson(const TypeIdPtr& pPtr, bool bIsRequire = true) const;
/**
* 生成某类型的解码源码
* @param pPtr
*
* @return string
*/
string writeTo(const TypeIdPtr &pPtr) const;
/**
* 生成某类型的编码源码
* @param pPtr
*
* @return string
*/
string readFrom(const TypeIdPtr &pPtr, bool bIsRequire = true) const;
/**
* 生成某类型的编码源码
* @param pPtr
*
* @return string
*/
// string promiseReadFrom(const TypeIdPtr &pPtr, bool bIsRequire = true) const;
/**
*
* @param pPtr
*
* @return string
*/
// string readUnknown(const TypeIdPtr &pPtr) const;
/**
*
* @param pPtr
*
* @return string
*/
// string writeUnknown()const;
/**
*
* @param pPtr
*
* @return string
*/
string display(const TypeIdPtr &pPtr) const;
/**
*
* @param pPtr
*
* @return string
*/
string displaySimple(const TypeIdPtr &pPtr, bool bSep) const;
/**
*
* @param pPtr
*
* @return string
*/
string generateCollection(const TypeIdPtr &pPtr, bool bSep) const;
//下面是类型描述的源码生成
protected:
/**
* 生成某类型的字符串描述源码
* @param pPtr
*
* @return string
*/
string tostr(const TypePtr &pPtr) const;
/**
* 生成内建类型的字符串源码
* @param pPtr
*
* @return string
*/
string tostrBuiltin(const BuiltinPtr &pPtr) const;
/**
* 生成vector的字符串描述
* @param pPtr
*
* @return string
*/
string tostrVector(const VectorPtr &pPtr) const;
/**
* 生成map的字符串描述
* @param pPtr
*
* @return string
*/
string tostrMap(const MapPtr &pPtr) const;
/**
* 生成某种结构的符串描述
* @param pPtr
*
* @return string
*/
string tostrStruct(const StructPtr &pPtr) const;
/**
* 生成某种枚举的符串描述
* @param pPtr
*
* @return string
*/
string tostrEnum(const EnumPtr &pPtr) const;
/**
* 获取定长数组的坐标
* @param pPtr
*
* @return string
*/
string toStrSuffix(const TypeIdPtr &pPtr) const;
/**
* 获取定长数组的坐标
* @param pPtr
*
* @return int
*/
int getSuffix(const TypeIdPtr &pPtr) const;
/**
* 生成unsigned转换为signed的符串描述
* @param pPtr
*
* @return string
*/
//string unsigned2signedStr(const BuiltinPtr &pPtr) const;
/**
* 生成类型变量的解码源码
* @param pPtr
*
* @return string
*/
string decode(const TypeIdPtr &pPtr) const;
/**
* 生成类型变量的编码源码
* @param pPtr
*
* @return string
*/
string encode(const TypeIdPtr &pPtr) const;
//以下是h文件的具体生成
protected:
/**
* 结构的md5
* @param pPtr
*
* @return string
*/
string MD5(const StructPtr &pPtr) const;
/**
* 生成结构的头文件内容
* @param pPtr
*
* @return string
*/
string generateH(const StructPtr &pPtr, const string& namespaceId) const;
/**
* 生成容器的头文件源码
* @param pPtr
*
* @return string
*/
string generateH(const ContainerPtr &pPtr) const;
/**
* 生成参数声明的头文件内容
* @param pPtr
*
* @return string
*/
string generateH(const ParamDeclPtr &pPtr) const;
/**
*
* @param pPtr
*
* @return string
*/
string generateOutH(const ParamDeclPtr &pPtr) const;
/**
*
* @param pPtr
* @param cn
*
* @return string
*/
string generateAsyncResponseCpp(const OperationPtr &pPtr, const string &cn) const;
/**
* 生成参数声明的内容
* @param pPtr
*
* @return string
*/
string generateParamDecl(const ParamDeclPtr &pPtr) const;
/**
* 生成操作函数调用分发的源码
* @param pPtr
* @param cn
*
* @return string
*/
string generateDispatchAsync(const OperationPtr &pPtr, const string &cn) const;
/**
* 生成操作函数调用分发的源码
* @param pPtr
* @param cn
*
* @return string
*/
string generateDispatchCoroAsync(const OperationPtr &pPtr, const string &cn) const;
/**
* 生成servant操作函数调用的源码
* @param pPtr
* @param cn
*
* @return string
*/
string generateServantDispatch(const OperationPtr& pPtr, const string& cn) const;
/**
* 生成操作的servant的头文件源码
* @param pPtr
* @param bVirtual
*
* @return string
*/
string generateHAsync(const OperationPtr &pPtr) const;
/**
* 生成操作的servant的头文件源码
* @param pPtr
* @param bVirtual
*
* @return string
*/
string generateHAsync(const OperationPtr &pPtr, const string& interfaceId) const;
/**
* 生成操作的servant的头文件源码
* @param pPtr
* @param bVirtual
*
* @return string
*/
// string generateHPromiseAsync(const InterfacePtr &pInter, const OperationPtr &pPtr) const;
/**
* 生成操作函数调用分发的源码
* @param pPtr
* @param cn
*
* @return string
*/
// string generateDispatchPromiseAsync(const OperationPtr &pPtr, const string &cn) const;
/**
* 生成操作的servant的头文件源码
* @param pPtr
* @param bVirtual
*
* @return string
*/
string generateH(const OperationPtr &pPtr, bool bVirtual, const string& interfaceId) const;
/**
* 生成接口的头文件源码
* @param pPtr
*
* @return string
*/
string generateH(const InterfacePtr &pPtr, const NamespacePtr &nPtr) const;
/**
* 生成枚举的头文件源码
* @param pPtr
*
* @return string
*/
string generateH(const EnumPtr &pPtr) const;
/**
* 生成常量头文件源码
* @param pPtr
*
* @return string
*/
string generateH(const ConstPtr &pPtr) const;
/**
* 生成名字空间的头文件源码
* @param pPtr
*
* @return string
*/
string generateH(const NamespacePtr &pPtr) const;
/**
* 生成名字空间的头文件源码
* @param pPtr
*
* @return string
*/
void generateH(const ContextPtr &pPtr) const;
/**
*
* 根据名字查找结构
* @param pPtr
* @param id
*
* @return StructPtr
*/
StructPtr findStruct(const ContextPtr &pPtr,const string &id);
// /**
// *
// * 生成接口编解码代码
// * @param pPtr
// * @param interface
// */
// void generateCoder(const ContextPtr &pPtr,const string &interface) const;
// string generateCoder(const NamespacePtr &pPtr,const string & sInterface) const;
// string generateCoder(const InterfacePtr &pPtr) const;
// string generateCoder(const OperationPtr &pPtr) const;
string generateInitValue(const TypeIdPtr &pPtr) const;
// bool isPromiseDispatchInitValue(const TypeIdPtr &pPtr) const;
private:
std::string _baseDir;
bool _checkDefault;
bool _onlyStruct;
bool _bSqlSupport;
bool _bXmlSupport;
bool _bJsonSupport;
vector<string> _vJsonIntf;
vector<string> _vXmlIntf;
std::string _namespace ;
// bool _unknownField;
bool _tarsMaster;
};
#endif