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

import("$dir_pw_build/input_group.gni")
import("$dir_pw_build/pw_executable.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_protobuf_compiler/proto.gni")
import("$dir_pw_unit_test/test.gni")

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

source_set("pw_protobuf") {
  public_configs = [ ":default_config" ]
  public_deps = [
    "$dir_pw_status",
    "$dir_pw_varint",
  ]
  public = [
    "public/pw_protobuf/codegen.h",
    "public/pw_protobuf/decoder.h",
    "public/pw_protobuf/encoder.h",
    "public/pw_protobuf/wire_format.h",
  ]
  sources = [
    "decoder.cc",
    "encoder.cc",
  ]
  sources += public
}

pw_doc_group("docs") {
  sources = [
    "decoding.rst",
    "docs.rst",
  ]
  report_deps = [
    "size_report:decoder_full",
    "size_report:decoder_incremental",
  ]
}

# Source files for pw_protobuf's protoc plugin.
pw_input_group("codegen_protoc_plugin") {
  inputs = [
    "py/pw_protobuf/codegen.py",
    "py/pw_protobuf/methods.py",
    "py/pw_protobuf/proto_structures.py",
  ]
}

pw_test_group("tests") {
  tests = [
    ":codegen_test",
    ":decoder_test",
    ":encoder_test",
  ]
}

pw_test("decoder_test") {
  deps = [ ":pw_protobuf" ]
  sources = [ "decoder_test.cc" ]
}

pw_test("encoder_test") {
  deps = [ ":pw_protobuf" ]
  sources = [ "encoder_test.cc" ]
}

pw_test("codegen_test") {
  deps = [
    ":codegen_test_protos_cc",
    ":pw_protobuf",
  ]
  sources = [ "codegen_test.cc" ]
}

pw_proto_library("codegen_test_protos") {
  sources = [
    "pw_protobuf_protos/test_protos/full_test.proto",
    "pw_protobuf_protos/test_protos/proto2.proto",
    "pw_protobuf_protos/test_protos/repeated.proto",
  ]
}
