fix generated interface handlers and client

This commit is contained in:
timurgordon
2025-01-04 01:01:43 -05:00
parent c91f9ba43c
commit be1cee5d6a
9 changed files with 122 additions and 21 deletions

View File

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

View File

@@ -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"

View File

@@ -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]
// ))
// }

View File

@@ -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}')
}
}

View File

@@ -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}')
}
}

View 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')
}

View File

@@ -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 {

View File

@@ -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')

View File

@@ -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