Skip to content

Commit

Permalink
Default template implementation added (#103)
Browse files Browse the repository at this point in the history
Default template implementation added
  • Loading branch information
HaseenaSainul committed Jul 11, 2023
1 parent 0def424 commit 6509066
Show file tree
Hide file tree
Showing 8 changed files with 83 additions and 59 deletions.
62 changes: 39 additions & 23 deletions languages/c/Types.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,9 @@ const hasTag = (method, tag) => {
return method.tags && method.tags.filter(t => t.name === tag).length > 0
}

const IsResultConstNullSuccess = (schema, name) => (name === 'success' && !schema.const && !schema.type)
const IsResultBooleanSuccess = (schema, name) => (name === 'success' && schema.type === 'boolean')

function getParamList(schema, module) {
let paramList = []
if (schema.params.length > 0) {
Expand Down Expand Up @@ -229,13 +232,13 @@ function getSchemaType(schema, module, { name, prefix = '', destination, resultS
return info.type
}

function getSchemaTypeInfo(module = {}, json = {}, name = '', schemas = {}, prefix = '', options = {level: 0, descriptions: true, title: false, resultSchema: false, event: false}) {
function getSchemaTypeInfo(module = {}, json = {}, name = '', schemas = {}, prefix = '', options = { level: 0, descriptions: true, title: false, resultSchema: false, event: false}) {

if (json.schema) {
json = json.schema
}

let stringAsHandle = options.resultSchema || options.event
let fireboltString = options.resultSchema || options.event

let structure = {}
structure["type"] = ''
Expand Down Expand Up @@ -263,7 +266,7 @@ function getSchemaTypeInfo(module = {}, json = {}, name = '', schemas = {}, pref
}
}
else if (json.const) {
structure.type = getNativeType(json, stringAsHandle)
structure.type = getNativeType(json, fireboltString)
structure.json = json
return structure
}
Expand Down Expand Up @@ -320,7 +323,7 @@ function getSchemaTypeInfo(module = {}, json = {}, name = '', schemas = {}, pref
return getSchemaTypeInfo(module, union, '', schemas, '', options)
}
else if (json.oneOf) {
structure.type = 'char*'
structure.type = fireboltString ? getFireboltStringType() : 'char*'
structure.json.type = 'string'
return structure
}
Expand All @@ -337,7 +340,7 @@ function getSchemaTypeInfo(module = {}, json = {}, name = '', schemas = {}, pref
structure.namespace = (json.namespace ? json.namespace : getModuleName(module))
}
else {
structure.type = 'char*'
structure.type = fireboltString ? getFireboltStringType() : 'char*'
}
if (name) {
structure.name = capitalize(name)
Expand All @@ -346,14 +349,14 @@ function getSchemaTypeInfo(module = {}, json = {}, name = '', schemas = {}, pref
return structure
}
else if (json.type) {
structure.type = getNativeType(json, stringAsHandle)
structure.json = json
if (name || json.title) {
structure.name = capitalize(name || json.title)
if (!IsResultBooleanSuccess(json, name) && !IsResultConstNullSuccess(json, name)) {
structure.type = getNativeType(json, fireboltString)
structure.json = json
if (name || json.title) {
structure.name = capitalize(name || json.title)
}
structure.namespace = getModuleName(module)
}
structure.namespace = getModuleName(module)

return structure
}
return structure
}
Expand All @@ -377,13 +380,12 @@ function getSchemaShapeInfo(json, module, schemas = {}, { name = '', prefix = ''
if (json['$ref'][0] === '#') {
//Ref points to local schema
//Get Path to ref in this module and getSchemaType
const schema = getPath(json['$ref'], module, schemas)
const tname = schema.title || json['$ref'].split('/').pop()
let schema = getPath(json['$ref'], module, schemas)
const tName = schema.title || json['$ref'].split('/').pop()
if (json['$ref'].includes('x-schemas')) {
schema = (getRefModule(json['$ref'].split('/')[2]))
}

shape = getSchemaShapeInfo(schema, module, schemas, { name, prefix, merged, level, title, summary, descriptions, destination, section, enums })
shape = getSchemaShapeInfo(schema, module, schemas, { name: tName, prefix, merged, level, title, summary, descriptions, destination, section, enums })
}
}
//If the schema is a const,
Expand Down Expand Up @@ -429,7 +431,6 @@ function getSchemaShapeInfo(json, module, schemas = {}, { name = '', prefix = ''
let info = getSchemaTypeInfo(module, items, items.name || pname, schemas, prefix, {level : level, descriptions: descriptions, title: true})
if (info.type && info.type.length > 0) {
let objName = tName + '_' + capitalize(prop.title || pname)
let moduleName = info.namespace
info.json.namespace = info.namespace
let moduleProperty = getJsonTypeInfo(module, json, json.title || name, schemas, prefix)
let prefixName = ((prefix.length > 0) && items['$ref']) ? '' : prefix
Expand Down Expand Up @@ -539,10 +540,14 @@ function getSchemaShapeInfo(json, module, schemas = {}, { name = '', prefix = ''

if (info.type && info.type.length > 0) {
let type = getArrayElementSchema(json, module, schemas, info.name)
let arrayName = capitalize(name) + capitalize(type.type)
let objName = getTypeName(info.namespace, arrayName, prefix)
let arrayName = capitalize(info.name) + capitalize(type.type)
let namespace = info.namespace
if (type && type.type === 'object') {
namespace = getModuleName(module)
}
let objName = getTypeName(namespace, arrayName, prefix)
let tName = objName + 'Array'
let moduleName = info.namespace

info.json.namespace = info.namespace
let moduleProperty = getJsonTypeInfo(module, json, json.title || name, schemas, prefix)
let subModuleProperty = getJsonTypeInfo(module, j, j.title, schemas, prefix)
Expand Down Expand Up @@ -712,6 +717,9 @@ function getJsonTypeInfo(module = {}, json = {}, name = '', schemas, prefix = ''
structure.type = getJsonNativeType(json)
return structure
}
else {
structure.type = 'JsonObject'
}
return structure
}

Expand Down Expand Up @@ -739,9 +747,17 @@ function getSchemaInstantiation(schema, module, name, { instantiationType = '' }
return getParameterInstantiation(getParamList(schema, module))
}
else if (instantiationType === 'result') {
let resultType = getSchemaType(schema, module, { title: true, name: name, resultSchema: true}) || ''
let resultJsonType = getJsonType(schema, module, {name: name}) || ''
return getResultInstantiation(name, resultType, resultJsonType)
let result = ''

if (!IsResultConstNullSuccess(schema, name)) {
let resultJsonType = getJsonType(schema, module, {name: name}) || ''
let resultType = ''
if (!IsResultBooleanSuccess(schema, name)) {
resultType = getSchemaType(schema, module, { title: true, name: name, resultSchema: true}) || ''
}
result = getResultInstantiation(name, resultType, resultJsonType)
}
return result
}
else if (instantiationType === 'callback.params') {
let resultJsonType = getJsonType(schema.result.schema, module, { name: schema.result.name }) || ''
Expand Down
26 changes: 16 additions & 10 deletions languages/c/src/types/ImplHelpers.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -455,16 +455,22 @@ function getResultInstantiation (name, nativeType, container, indentLevel = 3) {

let impl = ''

if (nativeType === 'char*' || nativeType === 'FireboltTypes_StringHandle') {
impl += `${' '.repeat(indentLevel)}${container}* strResult = new ${container}(jsonResult);` + '\n'
impl += `${' '.repeat(indentLevel)}*${name} = static_cast<${getFireboltStringType()}>(strResult);`
} else if (nativeType.includes('Handle')) {
impl += `${' '.repeat(indentLevel)}WPEFramework::Core::ProxyType<${container}>* resultPtr = new WPEFramework::Core::ProxyType<${container}>();\n`
impl += `${' '.repeat(indentLevel)}*resultPtr = WPEFramework::Core::ProxyType<${container}>::Create();\n`
impl += `${' '.repeat(indentLevel)}*(*resultPtr) = jsonResult;\n`
impl += `${' '.repeat(indentLevel)}*${name} = static_cast<${nativeType}>(resultPtr);`
} else {
impl += `${' '.repeat(indentLevel)}*${name} = jsonResult.Value();`
if (nativeType) {
impl += `${' '.repeat(indentLevel)}if (${name} != nullptr) {` + '\n'
if (nativeType === 'char*' || nativeType === 'FireboltTypes_StringHandle') {
impl += `${' '.repeat(indentLevel + 1)}${container}* strResult = new ${container}(jsonResult);` + '\n'
impl += `${' '.repeat(indentLevel + 1)}*${name} = static_cast<${getFireboltStringType()}>(strResult);`
} else if (nativeType.includes('Handle')) {
impl += `${' '.repeat(indentLevel + 1)}WPEFramework::Core::ProxyType<${container}>* resultPtr = new WPEFramework::Core::ProxyType<${container}>();\n`
impl += `${' '.repeat(indentLevel + 1)}*resultPtr = WPEFramework::Core::ProxyType<${container}>::Create();\n`
impl += `${' '.repeat(indentLevel + 1)}*(*resultPtr) = jsonResult;\n`
impl += `${' '.repeat(indentLevel + 1)}*${name} = static_cast<${nativeType}>(resultPtr);`
} else {
impl += `${' '.repeat(indentLevel + 1)}*${name} = jsonResult.Value();`
}
impl += `${' '.repeat(indentLevel)}}` + '\n'
} else if (name === 'success') {
impl += `${' '.repeat(indentLevel)}status = (jsonResult.Value() == true) ? FireboltSDKErrorNone : FireboltSDKErrorNotSupported;`
}

return impl
Expand Down
4 changes: 2 additions & 2 deletions languages/c/src/types/NativeHelpers.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -115,12 +115,12 @@ const getArrayElementSchema = (json, module, schemas = {}, name) => {
return result
}

const getNativeType = (json, stringAsHandle = false) => {
const getNativeType = (json, fireboltString = false) => {
let type
let jsonType = json.const ? typeof json.const : json.type
if (jsonType === 'string') {
type = 'char*'
if (stringAsHandle) {
if (fireboltString) {
type = getFireboltStringType()
}
}
Expand Down
6 changes: 2 additions & 4 deletions languages/c/templates/codeblocks/setter.c
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
/* ${method.name} - ${method.description} */
uint32_t ${info.title}_${method.Name}( ${method.signature.params} )
uint32_t ${info.Title}_${method.Name}( ${method.signature.params} )
{
const string method = _T("${info.title}.${method.name}");
${if.params}
${method.params.serialization}
${end.if.params}
${if.params}${method.params.serialization}${end.if.params}
return FireboltSDK::Properties::Set(method, jsonParameters);
}
3 changes: 3 additions & 0 deletions languages/c/templates/declarations/default.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
/* ${method.name} - ${method.description}
${method.params.annotations}${if.deprecated} * @deprecated ${method.deprecation}${end.if.deprecated} */
uint32_t ${info.Title}_${method.Name}( ${method.signature.params}${if.result}${if.params}, ${end.if.params}${method.result.type}* ${method.result.name}${end.if.result}${if.signature.empty}void${end.if.signature.empty} );
33 changes: 15 additions & 18 deletions languages/c/templates/methods/default.c
Original file line number Diff line number Diff line change
@@ -1,24 +1,21 @@
/* ${method.name} - ${method.description} */
uint32_t ${info.title}_${method.Name}(${method.params.list}${if.params}, ${end.if.params}${method.result.type}* ${method.result.name}) {
uint32_t status = FireboltSDKErrorUnavailable;
FireboltSDK::Transport<WPEFramework::Core::JSON::IElement>* transport = FireboltSDK::Accessor::Instance().GetTransport();
if (transport != nullptr) {

JsonObject jsonParameters;
uint32_t ${info.Title}_${method.Name}( ${method.signature.params}${if.result}${if.params}, ${end.if.params}${method.result.type}* ${method.result.name}${end.if.result}${if.signature.empty}void${end.if.signature.empty} ) {

${if.params}
${method.params.json}
${end.if.params}
uint32_t status = FireboltSDKErrorUnavailable;
FireboltSDK::Transport<WPEFramework::Core::JSON::IElement>* transport = FireboltSDK::Accessor::Instance().GetTransport();
if (transport != nullptr) {

WPEFramework::Core::JSON::Boolean jsonResult;
status = transport->Invoke("${info.title}.${method.name}", jsonParameters, jsonResult);
if (status == FireboltSDKErrorNone) {
*success = jsonResult.Value();
}
${method.params.serialization.with.indent}
${method.result.json.type} jsonResult;
status = transport->Invoke("${info.title}.${method.name}", jsonParameters, jsonResult);
if (status == FireboltSDKErrorNone) {
FIREBOLT_LOG_INFO(FireboltSDK::Logger::Category::OpenRPC, FireboltSDK::Logger::Module<FireboltSDK::Accessor>(), "${info.Title}.${method.name} is successfully invoked");
${method.result.instantiation}
}

} else {
FIREBOLT_LOG_ERROR(FireboltSDK::Logger::Category::OpenRPC, FireboltSDK::Logger::Module<FireboltSDK::Accessor>(), "Error in getting Transport err = %d", status);
}
} else {
FIREBOLT_LOG_ERROR(FireboltSDK::Logger::Category::OpenRPC, FireboltSDK::Logger::Module<FireboltSDK::Accessor>(), "Error in getting Transport err = %d", status);
}

return status;
return status;
}
2 changes: 1 addition & 1 deletion languages/c/templates/methods/property.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* ${method.name} - ${method.description} */
uint32_t ${info.title}_Get${method.Name}( ${method.signature.params}${if.params}, ${end.if.params}${method.result.type}* ${method.result.name} )
uint32_t ${info.Title}_Get${method.Name}( ${method.signature.params}${if.params}, ${end.if.params}${method.result.type}* ${method.result.name} )
{
const string method = _T("${info.title}.${method.name}");
${if.params}${method.params.serialization}${end.if.params}
Expand Down
6 changes: 5 additions & 1 deletion src/macrofier/engine.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -1123,9 +1123,12 @@ function insertMethodMacros(template, methodObj, json, templates, examples = {})
.replace(/\$\{method\.params\.array\}/g, JSON.stringify(methodObj.params.map(p => p.name)))
.replace(/\$\{method\.params\.count}/g, methodObj.params ? methodObj.params.length : 0)
.replace(/\$\{if\.params\}(.*?)\$\{end\.if\.params\}/gms, method.params.length ? '$1' : '')
.replace(/\$\{if\.params.empty\}(.*?)\$\{end\.if\.params.empty\}/gms, method.params.length === 0 ? '$1' : '')
.replace(/\$\{if\.result\}(.*?)\$\{end\.if\.result\}/gms, resultType ? '$1' : '')
.replace(/\$\{if\.params\.empty\}(.*?)\$\{end\.if\.params\.empty\}/gms, method.params.length === 0 ? '$1' : '')
.replace(/\$\{if\.signature\.empty\}(.*?)\$\{end\.if\.signature\.empty\}/gms, (method.params.length === 0 && resultType === '') ? '$1' : '')
.replace(/\$\{if\.context\}(.*?)\$\{end\.if\.context\}/gms, event && event.params.length ? '$1' : '')
.replace(/\$\{method\.params\.serialization\}/g, serializedParams)
.replace(/\$\{method\.params\.serialization\.with\.indent\}/g, indent(serializedParams, ' '))
// Typed signature stuff
.replace(/\$\{method\.signature\}/g, types.getMethodSignature(methodObj, json, { isInterface: false, destination: state.destination, section: state.section }))
.replace(/\$\{method\.signature\.params\}/g, types.getMethodSignatureParams(methodObj, json, { destination: state.destination, section: state.section }))
Expand Down Expand Up @@ -1164,6 +1167,7 @@ function insertMethodMacros(template, methodObj, json, templates, examples = {})
.replace(/\$\{event\.result\.json\.type\}/g, resultJsonType)
.replace(/\$\{event\.pulls\.param\.name\}/g, pullsEventParamName)
.replace(/\$\{method\.result\}/g, generateResult(result.schema, json, templates, { name: result.name }))
.replace(/\$\{method\.result\.json\.type\}/g, resultJsonType)
.replace(/\$\{method\.result\.instantiation\}/g, resultInst)
.replace(/\$\{method\.example\.value\}/g, JSON.stringify(methodObj.examples[0].result.value))
.replace(/\$\{method\.alternative\}/g, method.alternative)
Expand Down

0 comments on commit 6509066

Please sign in to comment.