# 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_unit_test/test.gni")
config("public") {
  include_dirs = [ "public" ]
  visibility = [ ":*" ]
}

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

pw_source_set("method_union") {
  public_configs = [ ":public" ]
  public = [ "public/pw_rpc/internal/raw_method_union.h" ]
  public_deps = [ ":method" ]
}

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

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

pw_test_group("tests") {
  tests = [
    ":codegen_test",
    ":raw_method_test",
    ":raw_method_union_test",
  ]
}

pw_test("codegen_test") {
  deps = [
    ":test_method_context",
    "..:test_protos.pwpb",
    "..:test_protos.raw_rpc",
    dir_pw_protobuf,
  ]
  sources = [ "codegen_test.cc" ]
}

pw_test("raw_method_test") {
  deps = [
    ":method_union",
    "..:test_protos.pwpb",
    "..:test_utils",
    dir_pw_protobuf,
  ]
  sources = [ "raw_method_test.cc" ]
}

pw_test("raw_method_union_test") {
  deps = [
    ":method_union",
    "..:test_protos.pwpb",
    "..:test_utils",
    dir_pw_protobuf,
  ]
  sources = [ "raw_method_union_test.cc" ]
}
