%YAML 1.2
--- |
  <%
  # TODO (mxyan): Make this list from build.yaml
  textual_headers = {"include/grpc/support/atm_gcc_atomic.h",
                     "include/grpc/support/atm_gcc_sync.h",
                     "include/grpc/support/atm_windows.h",
                     "include/grpc/support/sync_custom.h",
                     "include/grpc/support/sync_posix.h",
                     "include/grpc/support/sync_windows.h",
                     "include/grpc/support/tls_gcc.h",
                     "include/grpc/support/tls_msvc.h",
                     "include/grpc/support/tls_pthread.h",
                     "include/grpc/impl/codegen/atm_gcc_atomic.h",
                     "include/grpc/impl/codegen/atm_gcc_sync.h",
                     "include/grpc/impl/codegen/atm_windows.h",
                     "include/grpc/impl/codegen/sync_custom.h",
                     "include/grpc/impl/codegen/sync_posix.h",
                     "include/grpc/impl/codegen/sync_windows.h"}

  grpc_public_headers = {
      file for lib in libs for file in lib.get('public_headers', [])
      if lib.name in ("grpc", "gpr")
  }

  event_engine_files = {
      file for file in grpc_public_headers if 'event_engine' in file
  }

  def un_dir(files):
    return {f.split ('/', 2)[2] for f in files}

  def header_lines(files):
    return ('\n  ').join('header "%s"' % f for f in files)

  def textual_header_lines(files):
    return ('\n  ').join('textual header "%s"' % f for f in files)
  %>
  framework module grpc {
    umbrella header "grpc.h"

  ${header_lines(
      sorted(un_dir(grpc_public_headers - event_engine_files -
                    textual_headers)))}

  ${textual_header_lines(
      sorted(un_dir(grpc_public_headers.intersection(textual_headers) -
                    event_engine_files)))}

    export *
    module * { export * }
  }

