# Copyright 2021 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_bloat/bloat.gni")
import("$dir_pw_build/target_types.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_sync/backend.gni")
import("$dir_pw_unit_test/test.gni")

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

pw_source_set("static_router") {
  public_configs = [ ":public_include_path" ]
  public_deps = [
    ":egress",
    ":packet_parser",
    "$dir_pw_sync:mutex",
    dir_pw_metric,
  ]
  public = [ "public/pw_router/static_router.h" ]
  sources = [ "static_router.cc" ]
  deps = [ dir_pw_log ]
}

pw_source_set("egress") {
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_router/egress.h" ]
  public_deps = [ dir_pw_bytes ]
}

pw_source_set("packet_parser") {
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_router/packet_parser.h" ]
  public_deps = [ dir_pw_bytes ]
}

pw_source_set("egress_function") {
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_router/egress_function.h" ]
  public_deps = [ ":egress" ]
}

pw_doc_group("docs") {
  sources = [ "docs.rst" ]
  # TODO(frolv): This size report can't currently be built as the docs target
  # does not have a mutex backend.
  # report_deps = [ ":static_router_size" ]
}

pw_test_group("tests") {
  tests = [ ":static_router_test" ]
}

pw_test("static_router_test") {
  deps = [
    ":egress_function",
    ":static_router",
  ]
  sources = [ "static_router_test.cc" ]
  enable_if = pw_sync_MUTEX_BACKEND != ""
}

pw_size_report("static_router_size") {
  title = "pw::router::StaticRouter size report"
  binaries = [
    {
      target = "size_report:static_router_with_one_route"
      base = "size_report:base"
      label = "Static router with a single route"
    },
  ]
}
