diff --git a/lib/baobab/generator/generate_methods.v b/lib/baobab/generator/generate_methods.v index 8b7609df..4f637f2e 100644 --- a/lib/baobab/generator/generate_methods.v +++ b/lib/baobab/generator/generate_methods.v @@ -2,11 +2,10 @@ module generator import freeflowuniverse.herolib.core.code { Folder, IFile, VFile, CodeItem, File, Function, Param, Import, Module, Struct, CustomCode } import freeflowuniverse.herolib.core.texttools -import freeflowuniverse.herolib.schemas.openrpc import freeflowuniverse.herolib.schemas.openrpc.codegen {content_descriptor_to_parameter} import freeflowuniverse.herolib.baobab.specification {ActorMethod, ActorSpecification} -import os -import json + +const crud_prefixes = ['new', 'get', 'set', 'delete', 'list'] pub fn generate_methods_file(spec ActorSpecification) !VFile { actor_name_snake := texttools.name_fix_snake(spec.name) @@ -14,7 +13,24 @@ pub fn generate_methods_file(spec ActorSpecification) !VFile { mut items := []CodeItem{} for method in spec.methods { - items << generate_method_function(spec.name, method)! + method_fn := generate_method_function(spec.name, method)! + // check if method is a Base Object CRUD Method and + // if so generate the method's body + body := if is_base_object_new_method(method) { + generate_base_object_new_body(method)! + } else if is_base_object_get_method(method) { + generate_base_object_get_body(method)! + } else if is_base_object_set_method(method) { + generate_base_object_set_body(method)! + } else if is_base_object_delete_method(method) { + generate_base_object_delete_body(method)! + } else if is_base_object_list_method(method) { + generate_base_object_list_body(method)! + } else { + // default actor method body + "panic('implement')" + } + items << Function{...method_fn, body: body} } return VFile { @@ -23,15 +39,61 @@ pub fn generate_methods_file(spec ActorSpecification) !VFile { } } +// returns bodyless method prototype pub fn generate_method_function(actor_name string, method ActorMethod) !Function { actor_name_pascal := texttools.name_fix_snake_to_pascal(actor_name) return Function{ name: texttools.name_fix_snake(method.name) receiver: code.new_param(v: 'mut actor ${actor_name_pascal}Actor')! result: Param{...content_descriptor_to_parameter(method.result)!, is_result: true} - body:"panic('implement')" summary: method.summary description: method.description params: method.parameters.map(content_descriptor_to_parameter(it)!) } -} \ No newline at end of file +} + +fn is_base_object_new_method(method ActorMethod) bool { + return method.name.starts_with('new') +} + +fn is_base_object_get_method(method ActorMethod) bool { + return method.name.starts_with('get') +} + +fn is_base_object_set_method(method ActorMethod) bool { + return method.name.starts_with('set') +} + +fn is_base_object_delete_method(method ActorMethod) bool { + return method.name.starts_with('delete') +} + +fn is_base_object_list_method(method ActorMethod) bool { + return method.name.starts_with('list') +} + +fn generate_base_object_new_body(method ActorMethod) !string { + parameter := content_descriptor_to_parameter(method.parameters[0])! + return 'return actor.osis.new[${parameter.typ.vgen()}](${parameter.name})!' +} + +fn generate_base_object_get_body(method ActorMethod) !string { + parameter := content_descriptor_to_parameter(method.parameters[0])! + result := content_descriptor_to_parameter(method.result)! + return 'return actor.osis.get[${result.typ.vgen()}](${parameter.name})!' +} + +fn generate_base_object_set_body(method ActorMethod) !string { + parameter := content_descriptor_to_parameter(method.parameters[0])! + return 'return actor.osis.set[${parameter.typ.vgen()}](${parameter.name})!' +} + +fn generate_base_object_delete_body(method ActorMethod) !string { + parameter := content_descriptor_to_parameter(method.parameters[0])! + return 'return actor.osis.delete(${parameter.name})!' +} + +fn generate_base_object_list_body(method ActorMethod) !string { + result := content_descriptor_to_parameter(method.result)! + return 'return actor.osis.list[${result.typ.vgen()}]()!' +} diff --git a/lib/baobab/generator/write_object_methods.v b/lib/baobab/generator/write_object_methods.v index 95bf7b4e..19b3ce45 100644 --- a/lib/baobab/generator/write_object_methods.v +++ b/lib/baobab/generator/write_object_methods.v @@ -3,7 +3,6 @@ module generator import freeflowuniverse.herolib.baobab.specification {BaseObject} import freeflowuniverse.herolib.core.code { VFile, CodeItem, Function, Import, Param, Param, Struct, StructField, Type } import freeflowuniverse.herolib.core.texttools -import os const id_param = Param{ name: 'id' @@ -12,41 +11,41 @@ const id_param = Param{ } } -pub fn generate_object_code(actor Struct, object BaseObject) VFile { - obj_name := texttools.name_fix_pascal_to_snake(object.structure.name) - object_type := object.structure.name +// pub fn generate_object_code(actor Struct, object BaseObject) VFile { +// obj_name := texttools.name_fix_pascal_to_snake(object.structure.name) +// object_type := object.structure.name - mut items := []CodeItem{} - items = [generate_new_method(actor, object), generate_get_method(actor, object), - generate_set_method(actor, object), generate_delete_method(actor, object), - generate_list_result_struct(actor, object), generate_list_method(actor, object)] +// mut items := []CodeItem{} +// items = [generate_new_method(actor, object), generate_get_method(actor, object), +// generate_set_method(actor, object), generate_delete_method(actor, object), +// generate_list_result_struct(actor, object), generate_list_method(actor, object)] - items << generate_object_methods(actor, object) - mut file := code.new_file( - mod: texttools.name_fix(actor.name) - name: obj_name - imports: [ - Import{ - mod: object.structure.mod - types: [object_type] - }, - Import{ - mod: 'freeflowuniverse.herolib.baobab.backend' - types: ['FilterParams'] - }, - ] - items: items - ) +// items << generate_object_methods(actor, object) +// mut file := code.new_file( +// mod: texttools.name_fix(actor.name) +// name: obj_name +// imports: [ +// Import{ +// mod: object.structure.mod +// types: [object_type] +// }, +// Import{ +// mod: 'freeflowuniverse.herolib.baobab.backend' +// types: ['FilterParams'] +// }, +// ] +// items: items +// ) - if object.structure.fields.any(it.attrs.any(it.name == 'index')) { - // can't filter without indices - filter_params := generate_filter_params(actor, object) - file.items << filter_params.map(CodeItem(it)) - file.items << generate_filter_method(actor, object) - } +// if object.structure.fields.any(it.attrs.any(it.name == 'index')) { +// // can't filter without indices +// filter_params := generate_filter_params(actor, object) +// file.items << filter_params.map(CodeItem(it)) +// file.items << generate_filter_method(actor, object) +// } - return file -} +// return file +// } // generate_object_methods generates CRUD actor methods for a provided structure fn generate_get_method(actor Struct, object BaseObject) Function { @@ -309,41 +308,41 @@ fn generate_filter_method(actor Struct, object BaseObject) Function { } } -// generate_object_methods generates CRUD actor methods for a provided structure -fn generate_object_methods(actor Struct, object BaseObject) []Function { - object_name := texttools.name_fix_pascal_to_snake(object.structure.name) - object_type := object.structure.name +// // generate_object_methods generates CRUD actor methods for a provided structure +// fn generate_object_methods(actor Struct, object BaseObject) []Function { +// object_name := texttools.name_fix_pascal_to_snake(object.structure.name) +// object_type := object.structure.name - mut funcs := []Function{} - for method in object.methods { - mut params := [Param{ - name: 'id' - typ: Type{ - symbol: 'u32' - } - }] - params << method.params - funcs << Function{ - name: method.name - description: method.description - receiver: Param{ - name: 'actor' - typ: Type{ - symbol: actor.name - } - mutable: true - } - params: params - result: method.result - body: 'obj := actor.backend.get[${method.receiver.typ.symbol}](id)! - obj.${method.name}(${method.params.map(it.name).join(',')}) - actor.backend.set[${method.receiver.typ.symbol}](obj)! - ' - } - } +// mut funcs := []Function{} +// for method in object.methods { +// mut params := [Param{ +// name: 'id' +// typ: Type{ +// symbol: 'u32' +// } +// }] +// params << method.params +// funcs << Function{ +// name: method.name +// description: method.description +// receiver: Param{ +// name: 'actor' +// typ: Type{ +// symbol: actor.name +// } +// mutable: true +// } +// params: params +// result: method.result +// body: 'obj := actor.backend.get[${method.receiver.typ.symbol}](id)! +// obj.${method.name}(${method.params.map(it.name).join(',')}) +// actor.backend.set[${method.receiver.typ.symbol}](obj)! +// ' +// } +// } - return funcs -} +// return funcs +// } @[params] struct GenerateParamGetters {