# Copyright 2020 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.

# gn-format disable
import("//build_overrides/pigweed.gni")

import("$dir_pw_build/target_types.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_third_party/nanopb/nanopb.gni")
import("$dir_pw_unit_test/test.gni")
config("public") {
  include_dirs = [ "public" ]
  visibility = [ ":*" ]
}

pw_source_set("method") {
  public_configs = [ ":public" ]
  public = [ "public/pw_rpc/internal/nanopb_method.h" ]
  sources = [ "nanopb_method.cc" ]
  public_deps = [ "..:server" ]
  deps = [ dir_pw_log ]

  if (dir_pw_third_party_nanopb != "") {
    public_deps += [ "$dir_pw_third_party/nanopb" ]
  }
}

pw_source_set("service_method_traits") {
  public_configs = [ ":public" ]
  public = [ "public/pw_rpc/internal/service_method_traits.h" ]
  public_deps = [
    ":method",
    "..:server",
  ]
}

pw_source_set("test_method_context") {
  public_configs = [ ":public" ]
  public = [ "public/pw_rpc/test_method_context.h" ]
  public_deps = [
    ":service_method_traits",
    "..:server",
    dir_pw_assert,
    dir_pw_containers,
  ]
}

pw_source_set("echo_service") {
  public_configs = [ ":public" ]
  public_deps = [ "..:echo_service_proto_nanopb_rpc" ]
  sources = [ "public/pw_rpc/echo_service_nanopb.h" ]
}

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

pw_test_group("tests") {
  tests = [
    ":codegen_test",
    ":echo_service_test",
    ":nanopb_method_test",
    ":service_method_traits_test",
  ]
}

pw_test("codegen_test") {
  deps = [
    ":test_method_context",
    "..:server",
    "..:test_protos_nanopb_rpc",
  ]
  sources = [ "codegen_test.cc" ]
  enable_if = dir_pw_third_party_nanopb != ""
}

pw_test("nanopb_method_test") {
  deps = [
    ":method",
    "..:server",
    "..:test_protos_nanopb",
    "..:test_utils",
  ]
  sources = [ "nanopb_method_test.cc" ]
  enable_if = dir_pw_third_party_nanopb != ""
}

pw_test("echo_service_test") {
  deps = [
    ":echo_service",
    ":method",
    ":test_method_context",
  ]
  sources = [ "echo_service_test.cc" ]
  enable_if = dir_pw_third_party_nanopb != ""
}

pw_test("service_method_traits_test") {
  deps = [
    ":echo_service",
    ":method",
    ":service_method_traits",
    ":test_method_context",
    "..:test_protos_nanopb_rpc",
  ]
  sources = [ "service_method_traits_test.cc" ]
  enable_if = dir_pw_third_party_nanopb != ""
}
