generate base object CRUD methods (wip)
This commit is contained in:
@@ -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)!)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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()}]()!'
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user