def Generate(self, project_configuration, output_writer):
    # TODO: add support for libuna/libuna_types.h
    # TODO: types.h alingment of debug types?
    # TODO: do not generate libuna/libuna_libcstring.h
    # TODO: libsmraw/libsmraw_codepage.h alignment of definitions
    # TODO: libfvalue/libfvalue_codepage.h different

    include_header_path = os.path.join(
        self._projects_directory, project_configuration.library_name,
        u'include', project_configuration.library_name, u'types.h.in')

    include_header_file = TypesIncludeHeaderFile(include_header_path)
    include_header_file.ReadTypes(project_configuration)

    library_path = os.path.join(
        self._projects_directory, project_configuration.library_name,
        project_configuration.library_name)

    codepage_header_file = os.path.join(
        library_path, u'{0:s}_codepage.h'.format(
            project_configuration.library_name))
    error_header_file = os.path.join(
        library_path, u'{0:s}_error.h'.format(
            project_configuration.library_name))
    notify_header_file = os.path.join(
        library_path, u'{0:s}_notify.h'.format(
            project_configuration.library_name))
    types_header_file = os.path.join(
        library_path, u'{0:s}_types.h'.format(
            project_configuration.library_name))

    library_debug_type_definitions = []
    library_type_definitions = []
    for type_name in include_header_file.types:
      library_debug_type_definitions.append(
          u'typedef struct {0:s}_{1:s} {{}}\t{0:s}_{1:s}_t;'.format(
              project_configuration.library_name, type_name))
      library_type_definitions.append(
          u'typedef intptr_t {0:s}_{1:s}_t;'.format(
              project_configuration.library_name, type_name))

    template_mappings = project_configuration.GetTemplateMappings()
    template_mappings[u'library_debug_type_definitions'] = u'\n'.join(
        library_debug_type_definitions)
    template_mappings[u'library_type_definitions'] = u'\n'.join(
        library_type_definitions)

    for directory_entry in os.listdir(self._template_directory):
      if not directory_entry.startswith(u'libyal_'):
        continue

      if directory_entry.endswith(u'_{0:s}.h'.format(
          project_configuration.library_name)):
        continue

      if (directory_entry.endswith(u'_codepage.h') and (
          not os.path.exists(codepage_header_file) or
          project_configuration.library_name == u'libclocale')):
        continue

      if ((directory_entry.endswith(u'_libcerror.h') or
           directory_entry.endswith(u'_error.c') or
           directory_entry.endswith(u'_error.h')) and (
               not os.path.exists(error_header_file) or
               project_configuration.library_name == u'libcerror')):
        continue

      if ((directory_entry.endswith(u'_libcnotify.h') or
           directory_entry.endswith(u'_notify.c') or
           directory_entry.endswith(u'_notify.h')) and (
               not os.path.exists(notify_header_file) or
               project_configuration.library_name == u'libcnotify')):
        continue

      # TODO: improve generation of _types.h file
      if (directory_entry.endswith(u'_types.h') and (
              not os.path.exists(types_header_file) or
              project_configuration.library_name in (
                  u'libcerror', u'libcstring', u'libcthreads'))):
        continue

      template_filename = os.path.join(
          self._template_directory, directory_entry)
      if not os.path.isfile(template_filename):
        continue

      output_filename = u'{0:s}_{1:s}'.format(
          project_configuration.library_name, directory_entry[7:])
      output_filename = os.path.join(
          project_configuration.library_name, output_filename)

      if not os.path.exists(output_filename):
        continue

      self._GenerateSection(
          template_filename, template_mappings, output_writer, output_filename)
iterates over storage files metadata.
dataset/ETHPy150Open libyal/libyal/scripts/source-generate.py/LibrarySourceFileGenerator.Generate--crossover with--dataset/ETHPy150Open bepasty/bepasty-server/bepasty/views/filelist.py/file_infos