This commit is contained in:
2025-08-05 15:15:36 +02:00
parent 4bd960ed05
commit 7fabb4163a
192 changed files with 14901 additions and 0 deletions

View File

@@ -0,0 +1,9 @@
pub enum {{ type_name }}{
{% for elem in enum -%}
{% if is_integer -%}
{{ number_to_words(elem) }} = {{ elem }}
{% else -%}
{{ elem }}
{% endif -%}
{% endfor %}
}

View File

@@ -0,0 +1,77 @@
pub struct {{ actor_executor_name }}{
pub mut:
db &backend.Backend
redis &redisclient.Redis
}
pub fn (mut executor {{ actor_executor_name }}) execute(rpc_msg_id string, rpc_msg_method string, rpc_msg_params_str string) {
raw_params := json2.raw_decode(rpc_msg_params_str) or{
executor.return_error(rpc_msg_id, jsonrpc.invalid_params)
return
}
params_arr := raw_params.arr()
match rpc_msg_method {
{%- for method in methods %}
'{{method.name}}' {
{%- for param in method.params %}
{%- if generator.is_primitive(generator.get_param_type(method.name, param))%}
{{param.name}} := params_arr[{{loop.index0}}] as {{generator.get_param_type(method.name, param)}}
{%- else %}
{{param.name}} := json.decode({{generator.get_param_type(method.name, param)}}, params_arr[{{loop.index0}}].json_str()) or {
executor.return_error(rpc_msg_id, jsonrpc.invalid_request)
return
}
{%- endif %}
{%- endfor %}
{%- if generator.get_method_return_type(method) == 'none' %}
executor.{{method.name}}_internal({{generator.get_method_params_as_args(method)}}) or {
executor.return_error(rpc_msg_id, jsonrpc.InnerJsonRpcError{
code: 32000
message: '${err}'
})
return
}
response := jsonrpc.JsonRpcResponse[string]{
jsonrpc: '2.0.0'
id: rpc_msg_id
result: ''
}
{%- else %}
result := executor.{{method.name}}_internal({{generator.get_method_params_as_args(method)}}) or {
executor.return_error(rpc_msg_id, jsonrpc.InnerJsonRpcError{
code: 32000
message: '${err}'
})
return
}
response := jsonrpc.JsonRpcResponse[{{generator.get_method_return_type(method)}}]{
jsonrpc: '2.0.0'
id: rpc_msg_id
result: result
}
{%- endif %}
// put response in response queue
executor.redis.lpush(rpc_msg_id, response.to_json()) or {
println('failed to push response for ${rpc_msg_id} to redis queue: ${err}')
}
}
{%- endfor %}
else {
executor.return_error(rpc_msg_id, jsonrpc.method_not_found)
return
}
}
}
pub fn (mut executor {{actor_executor_name}}) return_error(rpc_msg_id string, error jsonrpc.InnerJsonRpcError){
response := jsonrpc.new_jsonrpcerror(rpc_msg_id, error)
executor.redis.lpush(rpc_msg_id, response.to_json()) or {
println('failed to push response for ${rpc_msg_id} to redis queue: ${err}')
}
}

View File

@@ -0,0 +1,50 @@
struct Handler {
pub mut:
db &backend.Backend
redis &redisclient.Redis
{% for actor in actors %}
{{actor}}_executor {{get_actor_executor_name(actor)}}
{%- endfor %}
}
pub fn new(db_config backend.BackendConfig, redis_addr string) !Handler{
db := backend.new(db_config)!
mut redis_client := redisclient.new([redis_addr])!
redis_client.selectdb(0)!
return Handler{
db: &db
redis: &redis_client
{%- for actor in actors %}
{{actor}}_executor: {{get_actor_executor_name(actor)}}{
db: &db
redis: &redis_client
}
{%- endfor %}
}
}
// handle handles an incoming JSON-RPC encoded message and returns an encoded response
pub fn (mut handler Handler) handle(id string, method string, params_str string) {
actor := method.all_before('.')
method_name := method.all_after('.')
match actor {
{%- for actor in actors %}
'{{ actor }}' {
spawn (&handler.{{actor}}_executor).execute(id, method_name, params_str)
}
{%- endfor %}
else {
handler.return_error(id, jsonrpc.method_not_found)
return
}
}
}
pub fn (mut handler Handler) return_error(rpc_msg_id string, error jsonrpc.InnerJsonRpcError){
response := jsonrpc.new_jsonrpcerror(rpc_msg_id, error)
handler.redis.lpush(rpc_msg_id, response.to_json()) or {
println('failed to push response for ${rpc_msg_id} to redis queue: ${err}')
}
}

View File

@@ -0,0 +1,31 @@
module myhandler
import x.json2
import rand
import freeflowuniverse.crystallib.baobab.backend
fn test_handler(){
db_config := backend.BackendConfig{
name: 'myhandler'
secret: 'secret'
reset: true
db_type: .postgres
}
mut handler := new(db_config, '127.0.0.1:6379')!
{% for method_name in method_names %}
do_request(mut handler, '{{method_name}}')!
{%- endfor %}
}
fn do_request(mut handler Handler, method_name string) ! {
// TODO: edit input parameters
mut params := []json2.Any{}
params << "objid"
params << "blabla_name"
params_str := json2.Any(params).json_str()
id := rand.string(6)
handler.handle(rand.string(6), method_name, json2.Any(params).json_str())
println('request id: ${id}')
}

View File

@@ -0,0 +1,7 @@
pub fn (mut executor {{ actor_executor_name }}) {{function_name}}({{method_params}}) !{{return_type}}{
// context allows us to see who the user is and which groups the user is
// context also gives a logging feature
// context is linked to 1 circle
// context is linked to a DB (OSIS)
panic('implement')
}

View File

@@ -0,0 +1,28 @@
pub fn (mut executor {{ actor_executor_name }}) {{variable_name}}_get_internal(id string) !{{type_name}}{
json_str := executor.db.indexer.get_json(id, backend.RootObject{
name: '{{type_name}}'
})!
return json.decode({{type_name}}, json_str)!
}
pub fn (mut executor {{ actor_executor_name }}) {{variable_name}}_set_internal({{variable_name}} {{type_name}}) !{
if {{variable_name}}.oid != ''{
executor.db.indexer.set(backend.RootObject{
id: {{variable_name}}.oid
name: '{{type_name}}'
})!
}
executor.db.indexer.new(backend.RootObject{
name: '{{type_name}}'
})!
}
pub fn (mut executor {{ actor_executor_name }}) {{variable_name}}_delete_internal(id string) !{
executor.db.indexer.delete(id, backend.RootObject{
name: '{{type_name}}'
})!
}

View File

@@ -0,0 +1,5 @@
pub struct {{method_param_struct_name}}{
{% for param_name, param_type in params.items()%}
{{param_name}} {{param_type}}
{%- endfor %}
}

View File

@@ -0,0 +1,75 @@
{% if method_example -%}
/*
Example:
{{ method_example }}
*/
{% endif -%}
{% if method_description -%}
/*
{{ method_description }}
*/
{% endif -%}
pub fn {{ function_name }}({{ vlang_code_generator.get_method_params(method_params) }}) {{ method_result }}{
mut conn := httpconnection.new(
name: 'openrpc_client'
url: '{{ base_url }}'
)!
mut params := map[string]json2.Any{}
{% for param_name, param_type in method_params.items() -%}
{% if vlang_code_generator.is_primitive(param_type) %}
params["{{ param_name }}"] = {{ param_name }}
{% elif vlang_code_generator.is_vlang_array(param_type) %}
mut any_arr := []json2.Any{}
for item in {{ param_name }}{
{% if vlang_code_generator.is_primitive(param_type[2:]) %}
any_arr << item
{% else %}
any_arr << json2.raw_decode(json2.encode(item))!
{% endif %}
}
params["{{ param_name }}"] = json2.Any(any_arr)
{%else %}
params["{{ param_name }}"] = json2.raw_decode(json2.encode({{ param_name }}))!
{% endif %}
{% endfor -%}
mut payload := map[string]json2.Any{}
payload['jsonrpc'] = "2.0"
payload['id'] = 0
payload['method'] = '{{ method_name }}'
payload['params'] = params
response := conn.send(method: .post, data: json2.encode(payload){% if url_path -%}, prefix: '{{ url_path }}' {% endif -%})!
if !response.is_ok() {
return error('failed to make rpc request: (${response.code}) ${response.data}')
}
{% if return_type != 'none' %}
mp := json2.raw_decode(response.data)!.as_map()
res := mp['result'] or {
return error('invalid jsonrpc result: ${response.data}')
}
if res is json2.Null{
return error('not found')
}
{% if vlang_code_generator.is_primitive(return_type) %}
return res as {{return_type}}
{% elif vlang_code_generator.is_vlang_array(return_type) %}
mut res_arr := {{return_type}}
for item in res.arr() {
{% if vlang_code_generator.is_primitive(return_type[2:]) %}
res_arr << item as {{return_type}}
{% else %}
res_arr << json2.decode[{{return_type[2:]}}](item.json_str())!
{% endif %}
}
return res_arr
{%else %}
return json2.decode[{{return_type}}](res.json_str())!
{% endif -%}
{% endif %}
}

View File

@@ -0,0 +1,5 @@
module {{module_name}}
{% for item in imports %}
import {{item}}
{%- endfor %}

View File

@@ -0,0 +1,10 @@
@[params]
pub struct {{ type_name }}{
pub mut:
{%- for property_name, property_info in properties.items() %}
{%- if property_info.description %}
// {{ property_info.description }}
{%- endif %}
{{ property_name }} {{ property_info.type_name }}
{%- endfor %}
}