lib/helper.js (544 lines of code) (raw):
'use strict';
const DSL = require('@darabonba/parser');
const fs = require('fs');
const path = require('path');
const { Tag } = DSL.Tag;
const filterTypes = ['readable', 'writeable', 'map', 'object', 'any', 'bytes', 'class', '$Error', '$Model'];
const keyWords = ['String', 'string', 'Prettify', 'prettify', 'map'];
const variableKeyWords = ['Client', 'client','@Client', '@client'];
function _name(str) {
return str.lexeme || str.name;
}
function _snakeCase(str) {
if (!str) {
return '';
}
let res = '';
let tmp = '';
for (const [, c] of [...str].entries()) {
// 检查字符是否为大写字母或数字
if (/[A-Z0-9]/.test(c)) {
tmp += c;
} else {
if (tmp.length > 0) {
res += (res === '' ? tmp.toLowerCase() : '_' + tmp.toLowerCase());
tmp = '';
}
res += c;
}
}
if (tmp.length > 0) {
res += (res === '' ? tmp.toLowerCase() : '_' + tmp.toLowerCase());
}
return res;
}
function _importFilter(name) {
if (keyWords.indexOf(name) !== -1) {
name = name + '_';
}
return name;
}
function _deleteWithSuffix(directory, suffix) {
if(!fs.existsSync(directory)) {
return;
}
const files = fs.readdirSync(directory, { withFileTypes: true });
for (const file of files) {
const filePath = path.join(directory, file.name);
if (file.isDirectory()) {
_deleteWithSuffix(filePath, suffix);
} else if (file.name.endsWith(suffix)) {
fs.unlinkSync(filePath);
}
}
}
function _isIterator(type) {
if (type.type === 'iterator' || type.type === 'asyncIterator') {
return true;
}
return false;
}
function _isKeyWord(name) {
return keyWords.indexOf(name) !== -1;
}
function _avoidVariableKeywords(name) {
if (variableKeyWords.indexOf(name) !== -1) {
return name + '_';
}
return name;
}
function _upperFirst(str) {
str = str.replace(/-/g, '_');
return str[0].toUpperCase() + str.substring(1);
}
function _lowerFirst(str) {
str = str.replace(/-/g, '_');
return str[0].toLowerCase() + str.substring(1);
}
function _vid(id) {
return `client.` + _upperFirst(id.substr(1));
}
function _setExtendFunc(name) {
var expr = '';
if (name === 'number' || name === 'integer' || name === 'int') {
expr = `dara.Int(`;
} else if (name === 'long' || name === 'int64') {
expr = `dara.Int64(`;
} else if (name === 'double') {
expr = `dara.Float64(`;
} else if (name === 'float') {
expr = `dara.Float32(`;
} else if (name === '[]float64') {
expr = `dara.Float64Slice(`;
} else if (name === '[]float32') {
expr = `dara.Float32Slice(`;
} else if (name === 'boolean') {
expr = `dara.Bool(`;
} else if (name === '[]bool') {
expr = `dara.BoolSlice(`;
} else if (name === 'string') {
expr = `dara.String(`;
} else if (name === 'int16') {
expr = `dara.Int16(`;
} else if (name === 'int32') {
expr = `dara.Int32(`;
} else if (name === '[]string') {
expr = `dara.StringSlice(`;
} else if (name === '[]int') {
expr = `dara.IntSlice(`;
} else if (name === '[]int32') {
expr = `dara.Int32Slice(`;
} else if (name === '[]int64') {
expr = `dara.Int64Slice(`;
} else if (name === '[]uint') {
expr = `dara.UintSlice(`;
} else if (name === '[]uint32') {
expr = `dara.Uint32Slice(`;
} else if (name === '[]uint64') {
expr = `dara.Uint64Slice(`;
} else if (name === 'uint') {
expr = `dara.Uint(`;
} else if (name === 'uint32') {
expr = `dara.Uint32(`;
} else if (name === 'uint64') {
expr = `dara.Uint64(`;
}
return expr;
}
function _setArrayFunc(name) {
var expr = '';
if (name === '[]float64') {
expr = `dara.ToFloat64Slice(`;
} else if (name === '[]float32') {
expr = `dara.Float32Slice(`;
} else if (name === '[]bool') {
expr = `dara.ToBoolSlice(`;
} else if (name === '[]string') {
expr = `dara.ToStringSlice(`;
} else if (name === '[]int') {
expr = `dara.ToIntSlice(`;
} else if (name === '[]int32') {
expr = `dara.ToInt32Slice(`;
} else if (name === '[]int64') {
expr = `dara.ToInt64Slice(`;
} else if (name === '[]uint') {
expr = `dara.ToUintSlice(`;
} else if (name === '[]uint32') {
expr = `dara.ToUint32Slice(`;
} else if (name === '[]uint64') {
expr = `dara.ToUint64Slice(`;
}
return expr;
}
function _initValue(type) {
if (type === 'number' || type === 'integer') {
return `${_setExtendFunc(type)}0)`;
}
if (type === 'string') {
return `${_setExtendFunc(type)}"")`;
}
if (type === 'boolean') {
return `${_setExtendFunc(type)}false)`;
}
if (type === 'bytes') {
return 'make([]byte, 0)';
}
if (type === 'any' || type === 'class' || type === '$Model') {
return 'interface{}(nil)';
}
if (type === '$Error') {
return '&dara.SDKError{}';
}
if (type === 'float') {
return `${_setExtendFunc(type)}0.00)`;
}
if (type === 'null') {
return 'nil';
}
if (type === '$Response') {
return '&dara.Response{}';
}
if (type === '$Request') {
return '&dara.Request{}';
}
if (type === '$SSEEvent') {
return '&dara.SSEEvent{}';
}
if (type === '$Date') {
return '&dara.Date{}';
}
if (type === '$File') {
return '&dara.File{}';
}
if (type === '$RetryOptions') {
return '&dara.RetryOptions{}';
}
if (type === '$RuntimeOptions') {
return '&dara.RuntimeOptions{}';
}
if (type === '$ExtendsParameters') {
return '&dara.ExtendsParameters{}';
}
if (type === '$URL') {
return '&dara.URL{}';
}
if (type === '$Stream') {
return '&dara.Stream{}';
}
if (type === 'object') {
return 'make(map[string]interface{})';
}
if (type.startsWith('map')) {
return `make(${type})`;
}
if (type.startsWith('[]')) {
return `make(${type}, 1)`;
}
return `&${type}{}`;
}
function _string(str) {
if (str.string === '""') {
return '\\"\\"';
}
return str.string.replace(/([^\\])"+|^"/g, function(str){
return str.replace(/"/g, '\\"');
});
}
function _format(name) {
var strs = name.split('-');
name = _upperFirst(strs[0]);
for (let i = 1; i < strs.length; i++) {
name = name + _upperFirst(strs[i]);
}
if (_isKeyWord(name)) {
name = name + '_';
}
return name;
}
function _extendFieldName(str){
return str.split('.').map(name => {
return _format(name);
}).join('');
}
function _modelName(name) {
if (name === '$Error') {
return 'dara.SDKError';
}
if (name === '$ResponseError') {
return 'dara.ResponseError';
}
if (name === '$SSEEvent') {
return 'dara.SSEEvent';
}
if (name === '$RetryOptions') {
return 'dara.RetryOptions';
}
if (name === '$RuntimeOptions') {
return 'dara.RuntimeOptions';
}
if (name === '$ExtendsParameters') {
return 'dara.ExtendsParameters';
}
if (name === '$Date') {
return 'dara.Date';
}
if (name === '$URL') {
return 'dara.URL';
}
if (name === '$File') {
return 'dara.File';
}
if (name === '$Response') {
return 'dara.Response';
}
if (name === '$Request') {
return 'dara.Request';
}
if (name === 'writeable') {
return 'io.Writer';
}
if (name === '$Model') {
return 'dara.Model';
}
return name;
}
function _field(name, type, required = false) {
return {
'attrs': [],
'fieldName': {
'lexeme': name,
'tag': Tag.ID,
},
'fieldValue': {
'fieldType': type,
'type': 'fieldType'
},
'tokenRange': [0, 0],
'required': required,
'type': 'modelField'
};
}
function _type(name) {
if (name === 'object') {
return 'map[string]interface{}';
}
if (name === 'integer' || name === 'number') {
return 'int';
}
if (name === 'readable') {
return 'io.Reader';
}
if (name === '$Error') {
return 'dara.BaseError';
}
if (name === '$ResponseError') {
return 'dara.ResponseError';
}
if (name === '$SSEEvent') {
return '*dara.SSEEvent';
}
if (name === '$RetryOptions') {
return '*dara.RetryOptions';
}
if (name === '$RuntimeOptions') {
return '*dara.RuntimeOptions';
}
if (name === '$ExtendsParameters') {
return '*dara.ExtendsParameters';
}
if (name === '$Date') {
return '*dara.Date';
}
if (name === '$URL') {
return '*dara.URL';
}
if (name === '$File') {
return '*dara.File';
}
if (name === 'bytes') {
return '[]byte';
}
if (name === 'int64') {
return 'int64';
}
if (name === 'uint64') {
return 'uint64';
}
if (name === 'int32') {
return 'int32';
}
if (name === 'uint32') {
return 'uint32';
}
if (name === 'int16') {
return 'int16';
}
if (name === 'uint16') {
return 'uint16';
}
if (name === 'int8') {
return 'int8';
}
if (name === 'uint8') {
return 'uint8';
}
if (name === '$Response') {
return '*dara.Response';
}
if (name === '$Request') {
return '*dara.Request';
}
if (name === 'writeable') {
return 'io.Writer';
}
if (name === 'double') {
return 'float64';
}
if (name === 'long' || name === 'int64') {
return 'int64';
}
if (name === 'float') {
return 'float32';
}
if (name === 'boolean') {
return 'bool';
}
if (name === 'any' || name === 'class' || name === '$Model') {
return 'interface{}';
}
if (name === 'string') {
return 'string';
}
name = '*' + name;
return name;
}
function _pointerType(name) {
if (name === 'object') {
return 'map[string]interface{}';
}
if (name === 'integer' || name === 'number') {
return '*int';
}
if (name === 'readable') {
return 'io.Reader';
}
if (name === 'bytes') {
return '[]byte';
}
if (name === 'uint64') {
return '*uint64';
}
if (name === 'int32') {
return '*int32';
}
if (name === 'uint32') {
return '*uint32';
}
if (name === '$Response') {
return '*dara.Response';
}
if (name === '$Request') {
return '*dara.Request';
}
if (name === '$RetryOptions') {
return '*dara.RetryOptions';
}
if (name === '$RuntimeOptions') {
return '*dara.RuntimeOptions';
}
if (name === '$ExtendsParameters') {
return '*dara.ExtendsParameters';
}
if (name === 'writeable') {
return 'io.Writer';
}
if (name === 'double') {
return '*float64';
}
if (name === 'long' || name === 'int64') {
return '*int64';
}
if (name === 'float') {
return '*float32';
}
if (name === 'boolean') {
return '*bool';
}
if (name === 'any' || name === 'class') {
return 'interface{}';
}
if (name === '$Model') {
return 'dara.Model';
}
if (name === '$Error') {
return '*dara.SDKError';
}
if (name === 'string') {
return '*string';
}
name = '*' + name;
return name;
}
function _avoidReserveName(name) {
const reserves = [
'function'
];
if (reserves.indexOf(name) !== -1) {
return `_${name}`;
}
return name;
}
function _setValueFunc(name) {
var expr = '';
if (name === 'number' || name === 'integer' || name === 'int') {
expr = `dara.IntValue(`;
} else if (name === 'long' || name === 'int64') {
expr = `dara.Int64Value(`;
} else if (name === 'double') {
expr = `dara.Float64Value(`;
} else if (name === 'float') {
expr = `dara.Float32Value(`;
} else if (name === '[]float64') {
expr = `dara.Float64SliceValue(`;
} else if (name === '[]float32') {
expr = `dara.Float32SliceValue(`;
} else if (name === 'boolean') {
expr = `dara.BoolValue(`;
} else if (name === '[]bool') {
expr = `dara.BoolSliceValue(`;
} else if (name === 'string') {
expr = `dara.StringValue(`;
} else if (name === 'int32') {
expr = `dara.Int32Value(`;
} else if (name === '[]string') {
expr = `dara.StringSliceValue(`;
} else if (name === '[]int') {
expr = `dara.IntSliceValue(`;
} else if (name === '[]int32') {
expr = `dara.Int32SliceValue(`;
} else if (name === '[]int16') {
expr = `dara.Int16SliceValue(`;
} else if (name === '[]int64') {
expr = `dara.Int64SliceValue(`;
} else if (name === 'uint64') {
expr = `dara.Uint64Value(`;
} else if (name === 'uint32') {
expr = `dara.Uint32Value(`;
} else if (name === 'uint16') {
expr = `dara.Uint16Value(`;
} else if (name === '[]uint64') {
expr = `dara.Uint64SliceValue(`;
} else if (name === '[]uint32') {
expr = `dara.Uint32SliceValue(`;
} else if (name === '[]uint16') {
expr = `dara.Uint16SliceValue(`;
}
return expr;
}
function _isFilterType(fieldType) {
return filterTypes.indexOf(fieldType) !== -1;
}
function _getAttr(node, attrName) {
for (let i = 0; i < node.attrs.length; i++) {
if (_name(node.attrs[i].attrName) === attrName) {
return node.attrs[i].attrValue.string;
}
}
}
function _escape(str) {
return str.replace(/>(Note:|Notice:|Warning:|Danger:)/g, '\t$1')
.replace(/(\*) +/g, '\t- ');
}
function _isBinaryOp(type){
const op = [
'or', 'eq', 'neq',
'gt', 'gte', 'lt',
'lte', 'add', 'subtract',
'div', 'multi', 'and'
];
return op.includes(type);
}
module.exports = {
_name, _string, _type, _format, _initValue, _avoidReserveName, _importFilter, _upperFirst, _snakeCase,
_setExtendFunc, _isFilterType, _getAttr, _setValueFunc, _vid, _pointerType, _lowerFirst, _escape, _deleteWithSuffix,
_avoidVariableKeywords, _isBinaryOp, _setArrayFunc, _isIterator, _modelName, _extendFieldName, _field
};