# 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_fuzzer/fuzzer.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/find.h",
    "public/pw_protobuf/wire_format.h",
  ]
  sources = [
    "decoder.cc",
    "encoder.cc",
    "find.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_pwpb.py",
    "py/pw_protobuf/plugin.py",
    "py/pw_protobuf/proto_tree.py",
  ]
}

pw_test_group("tests") {
  tests = [
    ":codegen_test",
    ":decoder_test",
    ":encoder_test",
    ":encoder_fuzzer",
    ":find_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("find_test") {
  deps = [ ":pw_protobuf" ]
  sources = [ "find_test.cc" ]
}

pw_test("codegen_test") {
  deps = [ ":codegen_test_protos_pwpb" ]
  sources = [ "codegen_test.cc" ]
}

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

pw_fuzzer("encoder_fuzzer") {
  sources = [ "encoder_fuzzer.cc" ]
  deps = [ ":pw_protobuf" ]
}
