...
This commit is contained in:
		@@ -0,0 +1,9 @@
 | 
			
		||||
pub enum {{ type_name }}{
 | 
			
		||||
    {% for elem in enum -%}
 | 
			
		||||
    {% if is_integer -%}
 | 
			
		||||
    {{ number_to_words(elem) }} = {{ elem }}
 | 
			
		||||
    {% else -%}
 | 
			
		||||
    {{ elem }}
 | 
			
		||||
    {% endif -%}
 | 
			
		||||
    {% endfor %}
 | 
			
		||||
}
 | 
			
		||||
@@ -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}')
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -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}')
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -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}')
 | 
			
		||||
}
 | 
			
		||||
@@ -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')
 | 
			
		||||
}
 | 
			
		||||
@@ -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}}'
 | 
			
		||||
    })!
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,5 @@
 | 
			
		||||
pub struct {{method_param_struct_name}}{
 | 
			
		||||
    {% for param_name, param_type in params.items()%}
 | 
			
		||||
    {{param_name}} {{param_type}}
 | 
			
		||||
    {%- endfor %}
 | 
			
		||||
}
 | 
			
		||||
@@ -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 %}
 | 
			
		||||
}   
 | 
			
		||||
@@ -0,0 +1,5 @@
 | 
			
		||||
module {{module_name}}
 | 
			
		||||
{% for item in imports %}
 | 
			
		||||
import {{item}}
 | 
			
		||||
{%- endfor %}
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,10 @@
 | 
			
		||||
@[params]
 | 
			
		||||
pub struct {{ struct_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 %}
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user