fix generated interface handlers and client
This commit is contained in:
@@ -1,8 +1,9 @@
|
||||
module generator
|
||||
|
||||
import freeflowuniverse.herolib.core.code { Folder, IFile, VFile, CodeItem, File, Function, Import, Module, Struct, CustomCode }
|
||||
import freeflowuniverse.herolib.core.code { Param, Folder, IFile, VFile, CodeItem, File, Function, Import, Module, Struct, CustomCode }
|
||||
import freeflowuniverse.herolib.core.texttools
|
||||
import freeflowuniverse.herolib.schemas.openrpc
|
||||
import freeflowuniverse.herolib.schemas.jsonschema.codegen as jsonschema_codegen {schemaref_to_type}
|
||||
import freeflowuniverse.herolib.schemas.openrpc.codegen {content_descriptor_to_parameter}
|
||||
import freeflowuniverse.herolib.baobab.specification {ActorMethod, ActorSpecification}
|
||||
import os
|
||||
@@ -16,7 +17,7 @@ pub fn generate_client_file(spec ActorSpecification) !VFile {
|
||||
|
||||
items << CustomCode {'
|
||||
pub struct Client {
|
||||
actor.Client
|
||||
stage.Client
|
||||
}
|
||||
|
||||
fn new_client() !Client {
|
||||
@@ -34,10 +35,14 @@ pub fn generate_client_file(spec ActorSpecification) !VFile {
|
||||
return VFile {
|
||||
imports: [
|
||||
Import{
|
||||
mod: 'freeflowuniverse.herolib.baobab.actor'
|
||||
mod: 'freeflowuniverse.herolib.baobab.stage'
|
||||
},
|
||||
Import{
|
||||
mod: 'freeflowuniverse.herolib.core.redisclient'
|
||||
},
|
||||
Import{
|
||||
mod: 'x.json2 as json'
|
||||
types: ['Any']
|
||||
}
|
||||
]
|
||||
name: 'client'
|
||||
@@ -52,14 +57,36 @@ pub fn generate_client_method(method ActorMethod) !Function {
|
||||
method.parameters.map(it.name).join(', ')
|
||||
} else {''}
|
||||
|
||||
body := "client.call_to_action(
|
||||
method: ${name_fixed}
|
||||
params: paramsparser.encode(${call_params}))"
|
||||
params_stmt := if method.parameters.len == 0 {
|
||||
''
|
||||
} else if method.parameters.len == 1 {
|
||||
'params := json.encode(${texttools.name_fix_snake(method.parameters[0].name)})'
|
||||
} else {
|
||||
'mut params_arr := []Any{}
|
||||
params_arr = [call_params]
|
||||
params := json.encode(params_arr.str())
|
||||
'
|
||||
}
|
||||
|
||||
mut client_call_stmt := "action := client.call_to_action(
|
||||
name: '${name_fixed}'"
|
||||
|
||||
if params_stmt != '' {
|
||||
client_call_stmt += 'params: params'
|
||||
}
|
||||
client_call_stmt += ')!'
|
||||
|
||||
result_type := schemaref_to_type(method.result.schema)!.vgen().trim_space()
|
||||
result_stmt := if result_type == '' {
|
||||
''
|
||||
} else {
|
||||
"return json.decode[${result_type}](action.result)!"
|
||||
}
|
||||
return Function {
|
||||
receiver: code.new_param(v: 'mut client Client')!
|
||||
result: code.new_param(v:'!')!
|
||||
result: Param{...content_descriptor_to_parameter(method.result)!, is_result: true}
|
||||
name: name_fixed
|
||||
body: '${params_stmt}\n${client_call_stmt}\n${result_stmt}'
|
||||
summary: method.summary
|
||||
description: method.description
|
||||
params: method.parameters.map(content_descriptor_to_parameter(it)!)
|
||||
|
||||
@@ -16,7 +16,7 @@ fn generate_handle_file(spec ActorSpecification) !VFile {
|
||||
}
|
||||
return VFile {
|
||||
name: 'act'
|
||||
imports: [Import{mod:'freeflowuniverse.herolib.baobab.actions' types:['Action']}]
|
||||
imports: [Import{mod:'freeflowuniverse.herolib.baobab.stage' types:['Action']}]
|
||||
items: items
|
||||
}
|
||||
}
|
||||
@@ -55,7 +55,7 @@ pub fn generate_method_handle(actor_name string, method ActorMethod) !string {
|
||||
actor_name_pascal := texttools.name_fix_snake_to_pascal(actor_name)
|
||||
name_fixed := texttools.name_fix_snake(method.name)
|
||||
if name_fixed == "create_pet" {
|
||||
println('debug ${method}')
|
||||
println('debugzo ${method}')
|
||||
}
|
||||
mut handler := '// Handler for ${name_fixed}\n'
|
||||
handler += "fn (mut actor ${actor_name_pascal}Actor) handle_${name_fixed}(data string) !string {\n"
|
||||
|
||||
@@ -42,7 +42,7 @@ module generator
|
||||
// return a.objects.map(code.new_file(
|
||||
// mod: texttools.name_fix(a.name)
|
||||
// name: '${texttools.name_fix(it.structure.name)}_model'
|
||||
// // imports: [Import{mod:'freeflowuniverse.herolib.baobab.actor'}]
|
||||
// // imports: [Import{mod:'freeflowuniverse.herolib.baobab.stage'}]
|
||||
// items: [it.structure]
|
||||
// ))
|
||||
// }
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import os
|
||||
import freeflowuniverse.herolib.baobab.actor {IActor, RunParams}
|
||||
import freeflowuniverse.herolib.baobab.stage {IActor, RunParams}
|
||||
import freeflowuniverse.herolib.schemas.openapi
|
||||
|
||||
const openapi_spec_path = '@{dollar}{os.dir(@@FILE)}/specs/openapi.json'
|
||||
@@ -7,12 +7,12 @@ const openapi_spec_json = os.read_file(openapi_spec_path) or { panic(err) }
|
||||
const openapi_specification = openapi.json_decode(openapi_spec_json)!
|
||||
|
||||
struct @{actor_name_pascal}Actor {
|
||||
actor.Actor
|
||||
stage.Actor
|
||||
}
|
||||
|
||||
fn new() !@{actor_name_pascal}Actor {
|
||||
return @{actor_name_pascal}Actor {
|
||||
actor.new('@{actor_name_snake}')
|
||||
stage.new_actor('@{actor_name_snake}')
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import os
|
||||
import freeflowuniverse.herolib.baobab.actor
|
||||
import freeflowuniverse.herolib.baobab.stage
|
||||
import freeflowuniverse.herolib.core.redisclient
|
||||
import freeflowuniverse.herolib.schemas.openapi
|
||||
|
||||
@@ -10,12 +10,12 @@ const openapi_specification = openapi.json_decode(openapi_spec_json)!
|
||||
|
||||
@@[heap]
|
||||
struct @{actor_name_pascal}Actor {
|
||||
actor.Actor
|
||||
stage.Actor
|
||||
}
|
||||
|
||||
fn new() !&@{actor_name_pascal}Actor {
|
||||
pub fn new() !&@{actor_name_pascal}Actor {
|
||||
return &@{actor_name_pascal}Actor {
|
||||
actor.new('@{actor_name_snake}')
|
||||
stage.new_actor('@{actor_name_snake}')
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
74
lib/baobab/generator/templates/client_test.v
Normal file
74
lib/baobab/generator/templates/client_test.v
Normal file
@@ -0,0 +1,74 @@
|
||||
module pet_store_actor
|
||||
|
||||
import freeflowuniverse.herolib.baobab.stage
|
||||
import freeflowuniverse.herolib.core.redisclient
|
||||
import x.json2 as json
|
||||
import time
|
||||
|
||||
fn mock_response() ! {
|
||||
mut redis := redisclient.new('localhost:6379')!
|
||||
mut rpc_q := redis.rpc_get('actor_pet_store')
|
||||
for {
|
||||
rpc_q.process(fn(method string, data string)!string{
|
||||
return json.encode(method)
|
||||
})!
|
||||
time.sleep(time.millisecond * 100) // Prevent CPU spinning
|
||||
}
|
||||
}
|
||||
|
||||
fn test_list_pets() ! {
|
||||
mut client := new_client()!
|
||||
limit := 10
|
||||
spawn mock_response()
|
||||
pets := client.list_pets(limit)!
|
||||
// assert pets.len <= limit
|
||||
println('test_list_pets passed')
|
||||
}
|
||||
|
||||
fn test_create_pet() ! {
|
||||
mut client := new_client()!
|
||||
client.create_pet()!
|
||||
println('test_create_pet passed')
|
||||
}
|
||||
|
||||
fn test_get_pet() ! {
|
||||
mut client := new_client()!
|
||||
pet_id := 1 // Replace with an actual pet ID in your system
|
||||
pet := client.get_pet(pet_id)!
|
||||
// assert pet.id == pet_id
|
||||
println('test_get_pet passed')
|
||||
}
|
||||
|
||||
fn test_delete_pet() ! {
|
||||
mut client := new_client()!
|
||||
pet_id := 1 // Replace with an actual pet ID in your system
|
||||
client.delete_pet(pet_id)!
|
||||
println('test_delete_pet passed')
|
||||
}
|
||||
|
||||
fn test_list_orders() ! {
|
||||
mut client := new_client()!
|
||||
client.list_orders()!
|
||||
println('test_list_orders passed')
|
||||
}
|
||||
|
||||
fn test_get_order() ! {
|
||||
mut client := new_client()!
|
||||
order_id := 1 // Replace with an actual order ID in your system
|
||||
order := client.get_order(order_id)!
|
||||
// assert order.id == order_id
|
||||
println('test_get_order passed')
|
||||
}
|
||||
|
||||
fn test_delete_order() ! {
|
||||
mut client := new_client()!
|
||||
order_id := 1 // Replace with an actual order ID in your system
|
||||
client.delete_order(order_id)!
|
||||
println('test_delete_order passed')
|
||||
}
|
||||
|
||||
fn test_create_user() ! {
|
||||
mut client := new_client()!
|
||||
client.create_user()!
|
||||
println('test_create_user passed')
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
import freeflowuniverse.herolib.schemas.openapi { OpenAPI }
|
||||
import freeflowuniverse.herolib.baobab.actor {Client, ClientConfig}
|
||||
import freeflowuniverse.herolib.baobab.stage {Client, ClientConfig}
|
||||
import freeflowuniverse.herolib.schemas.openrpc { OpenRPC }
|
||||
import freeflowuniverse.herolib.baobab.interfaces { HTTPServer, Context }
|
||||
import freeflowuniverse.herolib.baobab.stage.interfaces { HTTPServer, Context }
|
||||
import veb
|
||||
|
||||
pub fn new_http_server() !&HTTPServer {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import freeflowuniverse.herolib.baobab.interfaces
|
||||
import freeflowuniverse.herolib.baobab.stage.interfaces
|
||||
import freeflowuniverse.herolib.schemas.openrpc
|
||||
|
||||
const specification_path = os.join_path(os.dir(@@FILE), '/testdata/openrpc.json')
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env -S v -n -cg -w -enable-globals run
|
||||
|
||||
import freeflowuniverse.herolib.baobab.actors.accountant
|
||||
import freeflowuniverse.herolib.baobab.stages.accountant
|
||||
import vweb
|
||||
import freeflowuniverse.herolib.schemas.openrpc
|
||||
import os
|
||||
|
||||
Reference in New Issue
Block a user