/* * Created by PyramIDE. * User: フランスのトトロ aka (David RENÉ) * Date: 23/01/2017 * Time: 23:00 * © David RENÉ */ read tools/basis.anubis read tools/streams.anubis read tools/ISO-8601.anubis read system/string.anubis read densaku_lib/types/ds_message.anubis read types_messages.anubis public define Maybe(One) generate_message_message_description ( Stream stream, DS_Message ds_message //type description )= since ds_message is ds_message(message_name, _, fields), with title = message_name+" message format", write_string(stream, "\n"+ " "+title+"\n"+ " "+fill(length(title), '=')+"\n\n"+ // insert_type_message_description(ds_type)+ "\n" ) . public define String anb_type_to_message ( String type_msg, DS_Anubis_Type anb_type, String name )= with arg_name = "_"+to_lower(name), if anb_type is { one then "add_string("+type_msg+", \""+name+"\", "+arg_name+")", bool then "add_bool("+type_msg+", \""+name+"\", "+arg_name+")", int then "add_string("+type_msg+", \""+name+"\", to_String("+arg_name+"))", string then "add_string("+type_msg+", \""+name+"\", "+arg_name+")", float then "add_float("+type_msg+", \""+name+"\", "+arg_name+")", ds_type(type_name) then "add_message("+type_msg+", \""+name+"\", to_Message("+arg_name+"))", extern_type(type_name, _) then //external type. No need to check "add_message("+type_msg+", \""+name+"\", to_Message("+arg_name+"))", } . define String generate_fields_to_message ( String indent, String message_msg, List(DS_Field) fields )= if fields is { [] then "\n", [h . t] then since h is field(field_name, b_list, anb_type, comment), with name = to_lower(field_name), indent +"// [type = "+(if b_list is list then "List(" else "")+dump(anb_type)+(if b_list is list then ")" else "")+"] "+name+"\n"+ (if b_list is list then indent +"map_forget(("+dump(anb_type)+ " _"+name+") |-> "+anb_type_to_message(message_msg, anb_type, field_name, name)+", __"+name+")" else indent +"forget("+anb_type_to_message(message_msg, anb_type, field_name, name)+")") + ";\n" + generate_fields_to_message(indent, message_msg, t) } . define String argument_list_from_fields ( String indent, List(DS_Field) fields )= if fields is { [] then "", [h . t] then since h is field(name, b_list, anb_type, comment), indent+(if b_list is list then "List(" else "")+dump(anb_type)+(if b_list is list then ")" else "")+" _"+to_lower(name)+ (if is_empty(t) then "" else ",")+ (if comment is comment(comment_str) then " //"+comment_str else "")+"\n"+ argument_list_from_fields(indent, t) } . public define Maybe(One) generate_to_message ( Stream stream, DS_Message ds_message //type description )= since ds_message is ds_message(message_name, what_code, fields), with lower_message_name = "_"+to_lower(message_name), message_msg = lower_message_name+"_message", write_string(stream, "public define Message\n"+ " make_"+message_name+"\n"+ " (\n"+ argument_list_from_fields(" ", fields)+ " )=\n"+ " with "+message_msg+" = message("+what_code+"), //\n"+ " forget(add_string("+message_msg+", \"__MSG__\", \""+what_code+"\"));\n\n"+ //" if "+lower_message_name+" is\n"+ generate_fields_to_message(" ", message_msg, fields) + //" };\n"+ " "+message_msg+"\n"+ ".\n\n" ) . /****************************** FROM MESSAGE ***********************************/ define String generate_fields_from_message ( String indent, String type_msg, List(DS_Field) fields, Var(Int) brace_counter )= if fields is { [] then "", [h . t] then since h is field(field_name, b_list, anb_type, comment), with name = "_"+to_lower(field_name), indent + "// [Field's type = "+(if b_list is list then "List(" else "")+dump(anb_type)+(if b_list is list then ")" else "")+"] Field's name '"+field_name+"'\n"+ (if b_list is list then anb_type_list_from_message(indent, type_msg, anb_type, field_name, "_"+name+"_", brace_counter) else anb_type_from_message(indent, type_msg, anb_type, field_name, "_"+name+"_", brace_counter)) + generate_fields_from_message(indent, type_msg, t, brace_counter) } . define String anonymous_aggregat_from_fields ( List(DS_Field) fields )= if fields is { [] then "", [h . t] then since h is field(name, b_list, anb_type, comment), (if b_list is list then "List(" else "")+dump(anb_type)+(if b_list is list then ")" else "")+" _"+to_lower(name)+ (if is_empty(t) then "" else ", ")+ //(if comment is comment(comment_str) then " //"+comment_str else "")+"\n"+ anonymous_aggregat_from_fields(t) } . define String anonymous_aggregat_value_from_fields ( List(DS_Field) fields )= join(", ", map((DS_Field field) |-> "_"+to_lower(field.field_name), fields)). if fields is { [] then "", [h . t] then since h is field(name, b_list, anb_type, comment), (if b_list is list then "List(" else "")+dump(anb_type)+(if b_list is list then ")" else "")+" _"+to_lower(name)+ (if is_empty(t) then "" else ", ")+ //(if comment is comment(comment_str) then " //"+comment_str else "")+"\n"+ anonymous_aggregat_from_fields(t) } . public define Maybe(One) /* generate the function which return Maybe(anonymous aggregat) from message. * the aggregat contain all types used to construct the message */ generate_from_message ( Stream stream, //the file in which we write DS_Message ds_message //type description )= since ds_message is ds_message(message_name, what_code, fields), with brace_counter = (Var(Int))var(0), lower_message_name = "_"+to_lower(message_name), message_msg = lower_message_name+"_message", write_string(stream, "public define Maybe(("+anonymous_aggregat_from_fields(fields)+"))\n"+ " get_"+message_name+"\n"+ " (\n"+ " Message "+message_msg+"\n"+ " )=\n"+ " if find_string("+message_msg+", \"__MSG__\") is {failure then failure, success(__msg__) then\n"+ " if __msg__ = \""+what_code+"\" then \n"+ with fields_from_message = generate_fields_from_message(" ",message_msg, fields, brace_counter), fields_from_message+ " success(("+anonymous_aggregat_value_from_fields(fields)+"))\n"+ " "+fill(*brace_counter, '}') +"\n"+ " else\n"+ " failure //No valid message found !\n"+ " }\n"+ ".\n\n" ) .