50 lines
1.5 KiB
V
50 lines
1.5 KiB
V
module generator
|
|
|
|
import incubaid.herolib.develop.codetools as code { CodeItem, Import, Param, VFile }
|
|
import incubaid.herolib.core.texttools
|
|
import incubaid.herolib.schemas.openrpc.codegen
|
|
import incubaid.herolib.baobab.specification { ActorSpecification }
|
|
import incubaid.herolib.schemas.openapi
|
|
import incubaid.herolib.schemas.openrpc
|
|
|
|
pub fn generate_methods_interface_file_str(source Source) !string {
|
|
actor_spec := if path := source.openapi_path {
|
|
specification.from_openapi(openapi.new(path: path)!)!
|
|
} else if path := source.openrpc_path {
|
|
specification.from_openrpc(openrpc.new(path: path)!)!
|
|
} else {
|
|
panic('No openapi or openrpc path provided')
|
|
}
|
|
return generate_methods_interface_file(actor_spec)!.write_str()!
|
|
}
|
|
|
|
pub fn generate_methods_interface_file(spec ActorSpecification) !VFile {
|
|
return VFile{
|
|
name: 'methods_interface'
|
|
imports: [
|
|
Import{
|
|
mod: 'incubaid.herolib.baobab.osis'
|
|
types: ['OSIS']
|
|
},
|
|
]
|
|
items: [CodeItem(generate_methods_interface_declaration(spec)!)]
|
|
}
|
|
}
|
|
|
|
// returns bodyless method prototype
|
|
pub fn generate_methods_interface_declaration(spec ActorSpecification) !code.Interface {
|
|
name_snake := texttools.snake_case(spec.name)
|
|
name_pascal := texttools.pascal_case(spec.name)
|
|
receiver := generate_methods_receiver(spec.name)
|
|
receiver_param := Param{
|
|
mutable: true
|
|
name: name_snake[0].ascii_str()
|
|
typ: code.Object{receiver.name}
|
|
}
|
|
return code.Interface{
|
|
is_pub: true
|
|
name: 'I${name_pascal}'
|
|
methods: spec.methods.map(generate_method_prototype(receiver_param, it)!)
|
|
}
|
|
}
|