Files
herolib/libarchive/baobab/generator/generate_methods_interface.v
2025-10-12 12:30:19 +03:00

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)!)
}
}