message_messages.anubis 6.64 KB
/*
 * Created by PyramIDE.
 * User: フランスのトトロ aka (David RENÉ) 
 * Date: 23/01/2017
 * Time: 23:00
 * © Calexium 
 */

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"
  )
.