/+
  object setter
  ao_object_setter.d
+/
template ObjectSetter() {
  /+ structs +/
  struct HeadingAttrib {
    int lev                   = 9;   // use of enum should make this redundant, remove
    int lev_markup_number     = 9;
    int lev_collapsed_number  = 9;
  }
  struct ParaAttrib {
    int indent_start          = 0;
    int indent_rest           = 0;
    bool bullet               = false;
  }
  struct BlockAttrib {
    string syntax                 = "";
  }
  struct Comment {
    // no .attrib and no .obj_cite_number
  }
  struct Node {
    int ocn                    = 0;
    int parent_lev             = 0;
    int parent_ocn             = 0;
    string node                = "";
  }
  struct ObjComposite {
    // size_t id;
    string use                 = "";
    string of                  = "";
    string is_a                = "";
    string object              = "";
    string obj_cite_number     = "";  // not used for calculations? output only? else int
    HeadingAttrib heading_attrib;
    ParaAttrib para_attrib;
    BlockAttrib block_attrib;
    Node node_structure;
  }
  struct ObjCompositeArr {
    ObjComposite[] oca;
  }
  /+ structs setter +/
  struct ObjectAbstractSet {
    import std.conv : to;
    auto contents_comment(in string object) {
      ObjComposite object_set;
      object_set.use                  = "comment";
      object_set.of                   = "comment";
      object_set.is_a                 = "comment";
      object_set.object               = object;
      return object_set;
    }
    auto contents_heading(
      in string object,
      in string attrib,
      in int obj_cite_number,
      in int lev_markup_number,
      in int lev_collapsed_number,
    ) {
      ObjComposite object_set;
      object_set.use                                 = "content";
      object_set.of                                  = "para";
      object_set.is_a                                = "heading";
      object_set.object                              = object;
      object_set.obj_cite_number                     = (obj_cite_number==0) ? "" : to!string(obj_cite_number);
      object_set.heading_attrib.lev_markup_number    = lev_markup_number;
      object_set.heading_attrib.lev_collapsed_number = lev_collapsed_number;
      // object_set.node_structure.node               = node;
      return object_set;
    }
    auto contents_para(
      in string is_a,
      in string object,
      in string attrib,
      in int obj_cite_number,
      in string[string] indent,
      in bool bullet
    ) {
      ObjComposite object_set;
      object_set.use                      = "content";
      object_set.of                       = "para";
      object_set.is_a                     = "para";
      object_set.object                   = object.strip;
      object_set.obj_cite_number          = (obj_cite_number==0) ? "" : to!string(obj_cite_number);
      object_set.para_attrib.indent_start = 0; // indent["hang_position"];
      object_set.para_attrib.indent_rest  = 0; // indent["base_position"];
      object_set.para_attrib.bullet       = false;
      // object_set.node_structure.node               = node;
      return object_set;
    }
    auto contents_endnote(
      in string object,
    ) {
      auto m = (matchFirst(object, rgx.note_ref));
      string notenumber = to!string(m.captures[1]);
      string anchor_tag = "note_" ~ notenumber;
      ObjComposite object_set;
      object_set.use                      = "content";
      object_set.of                       = "para";
      object_set.is_a                     = "endnote";
      object_set.object                   = object.strip;
      object_set.obj_cite_number          = "";
      object_set.para_attrib.indent_start = 0;
      object_set.para_attrib.indent_rest  = 0;
      object_set.para_attrib.bullet       = false;
      return object_set;
    }
    auto contents_block(
      in string type,
      in string object,
      in string attrib,
      in int obj_cite_number
    ) {
      ObjComposite object_set;
      object_set.use                 = "content";
      object_set.of                  = "block";
      object_set.is_a                = type;
      object_set.object              = object;
      object_set.obj_cite_number     = (obj_cite_number==0) ? "" : to!string(obj_cite_number);
      // object_set.node_structure.node               = node;
      return object_set;
    }
    auto contents_block_code(
      in string type,
      in string object,
      in string attrib_language_syntax,
      in int obj_cite_number
    ) {
      ObjComposite object_set;
      object_set.use                 = "content";
      object_set.of                  = "block";
      object_set.is_a                = type;
      object_set.block_attrib.syntax = attrib_language_syntax;
      object_set.object              = object;
      object_set.obj_cite_number     = (obj_cite_number==0) ? "" : to!string(obj_cite_number);
      // object_set.node_structure.node               = node;
      return object_set;
    }
    auto contents_block_obj_cite_number_string(
      in string type,
      in string object,
      in string obj_cite_number,
      in string node
    ) {
      ObjComposite object_set;
      object_set.use                               = "content";
      object_set.of                                = "block";
      object_set.is_a                              = type;
      object_set.object                            = object;
      object_set.obj_cite_number                   = obj_cite_number;
      object_set.node_structure.node               = node;
      return object_set;
    }
  }
}