# Copyright 2022 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

import("//build_overrides/pigweed.gni")

import("$dir_pw_async/async.gni")
import("$dir_pw_async/backend.gni")
import("$dir_pw_async/fake_dispatcher_fixture.gni")
import("$dir_pw_async/fake_dispatcher_test.gni")
import("$dir_pw_async/heap_dispatcher.gni")
import("$dir_pw_build/facade.gni")
import("$dir_pw_build/target_types.gni")
import("$dir_pw_chrono/backend.gni")
import("$dir_pw_docgen/docs.gni")

config("public_include_path") {
  include_dirs = [ "public" ]
}

pw_source_set("dispatcher") {
  public_configs = [ ":public_include_path" ]
  public_deps = [
    ":types",
    "$dir_pw_chrono:system_clock",
    dir_pw_function,
    dir_pw_status,
  ]
  public = [
    "public/pw_async/dispatcher.h",
    "public/pw_async/function_dispatcher.h",
  ]
  visibility = [
                 ":*",
                 "$dir_pw_async_basic:*",
                 "$dir_pw_bluetooth_sapphire/*",
                 "$dir_pw_grpc/*",
               ] + pw_async_EXPERIMENTAL_MODULE_VISIBILITY
}

pw_facade("task") {
  backend = pw_async_TASK_BACKEND
  public_configs = [ ":public_include_path" ]
  public_deps = [
    ":types",
    "$dir_pw_chrono:system_clock",
    dir_pw_function,
    dir_pw_status,
  ]
  public = [ "public/pw_async/task.h" ]
  visibility = [
                 ":*",
                 "$dir_pw_async_basic:*",
                 "$dir_pw_bluetooth_sapphire/*",
                 "$dir_pw_grpc/*",
               ] + pw_async_EXPERIMENTAL_MODULE_VISIBILITY
}

pw_source_set("types") {
  public_configs = [ ":public_include_path" ]
  public_deps = [
    dir_pw_function,
    dir_pw_status,
  ]
  public = [
    "public/pw_async/context.h",
    "public/pw_async/task_function.h",
  ]
  visibility = [
                 ":*",
                 "$dir_pw_async_basic:*",
               ] + pw_async_EXPERIMENTAL_MODULE_VISIBILITY
}

pw_facade("fake_dispatcher") {
  backend = pw_async_FAKE_DISPATCHER_BACKEND
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_async/fake_dispatcher.h" ]
  public_deps = [ ":dispatcher" ]
  visibility = [
                 ":*",
                 "$dir_pw_async_basic:*",
                 "$dir_pw_bluetooth_sapphire/*",
               ] + pw_async_EXPERIMENTAL_MODULE_VISIBILITY
}

fake_dispatcher_fixture("fake_dispatcher_fixture") {
  backend = ":fake_dispatcher"
  visibility = [
                 ":*",
                 "$dir_pw_async_basic:*",
                 "$dir_pw_bluetooth_sapphire/*",
               ] + pw_async_EXPERIMENTAL_MODULE_VISIBILITY
}

pw_async_heap_dispatcher_source_set("heap_dispatcher") {
  task_backend = ":task"
  visibility = [
                 ":*",
                 "$dir_pw_async_basic:*",
                 "$dir_pw_bluetooth_sapphire/*",
               ] + pw_async_EXPERIMENTAL_MODULE_VISIBILITY
}

pw_test_group("tests") {
}

pw_doc_group("docs") {
  sources = [
    "backends.rst",
    "docs.rst",
  ]
}

# Satisfy source_is_in_build_files presubmit step
pw_source_set("satisfy_presubmit") {
  sources = [
    "fake_dispatcher_test.cc",
    "heap_dispatcher.cc",
    "public/pw_async/fake_dispatcher_fixture.h",
    "public/pw_async/heap_dispatcher.h",
  ]
  visibility = []
}
