# Copyright 2026 Google LLC
#
# 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.
#

load("@rules_cc//cc:cc_library.bzl", "cc_library")
load("@rules_cc//cc:cc_test.bzl", "cc_test")

package(default_visibility = ["//visibility:public"])

cc_library(
    name = "constants",
    hdrs = ["constants.h"],
    deps = [
        "@abseil-cpp//absl/strings:string_view",
    ],
)

cc_library(
    name = "reader",
    srcs = ["reader.cc"],
    hdrs = ["reader.h"],
    deps = [
        ":constants",
        "@abseil-cpp//absl/functional:function_ref",
        "@abseil-cpp//absl/status",
        "@abseil-cpp//absl/status:status_macros",
        "@abseil-cpp//absl/status:statusor",
        "@abseil-cpp//absl/strings",
        "@riegeli//riegeli/bytes:reader",
        "@riegeli//riegeli/endian:endian_reading",
    ],
)

cc_test(
    name = "reader_test",
    srcs = ["reader_test.cc"],
    deps = [
        ":reader",
        ":test_utils",
        "@abseil-cpp//absl/status",
        "@abseil-cpp//absl/status:status_macros",
        "@abseil-cpp//absl/status:status_matchers",
        "@abseil-cpp//absl/status:statusor",
        "@abseil-cpp//absl/strings:string_view",
        "@abseil-cpp//absl/types:span",
        "@googletest//:gtest_main",
        "@riegeli//riegeli/bytes:reader",
        "@riegeli//riegeli/bytes:string_reader",
    ],
)

cc_library(
    name = "test_utils",
    testonly = True,
    srcs = ["test_utils.cc"],
    hdrs = ["test_utils.h"],
    deps = [
        "@abseil-cpp//absl/status",
        "@abseil-cpp//absl/status:status_macros",
        "@abseil-cpp//absl/status:statusor",
        "@abseil-cpp//absl/types:span",
        "@riegeli//riegeli/bytes:string_writer",
        "@riegeli//riegeli/bytes:writer",
        "@riegeli//riegeli/endian:endian_writing",
    ],
)

cc_library(
    name = "crc",
    srcs = ["crc.cc"],
    hdrs = ["crc.h"],
    deps = [
        "@abseil-cpp//absl/strings:string_view",
    ],
)

cc_test(
    name = "crc_test",
    srcs = ["crc_test.cc"],
    deps = [
        ":crc",
        "@googletest//:gtest_main",
    ],
)

cc_library(
    name = "extractor",
    srcs = ["extractor.cc"],
    hdrs = ["extractor.h"],
    deps = [
        ":constants",
        ":crc",
        ":reader",
        "//constants:labels",
        "//formats:asset_box",
        "//formats:byte_range",
        "//formats:extractor",
        "//jumbf:utils",
        "@abseil-cpp//absl/status",
        "@abseil-cpp//absl/status:status_macros",
        "@abseil-cpp//absl/status:statusor",
        "@abseil-cpp//absl/strings",
        "@abseil-cpp//absl/strings:string_view",
        "@riegeli//riegeli/bytes:reader",
        "@riegeli//riegeli/endian:endian_reading",
    ],
)

cc_test(
    name = "extractor_test",
    srcs = ["extractor_test.cc"],
    deps = [
        ":extractor",
        ":test_utils",
        "//formats:asset_box",
        "//formats:byte_range",
        "//formats:extractor_result",
        "//testing:jumbf_utils",
        "@abseil-cpp//absl/log:check",
        "@abseil-cpp//absl/status",
        "@abseil-cpp//absl/status:status_matchers",
        "@abseil-cpp//absl/status:statusor",
        "@abseil-cpp//absl/strings:string_view",
        "@googletest//:gtest_main",
        "@riegeli//riegeli/bytes:string_reader",
    ],
)

cc_library(
    name = "assessor",
    srcs = ["assessor.cc"],
    hdrs = ["assessor.h"],
    deps = [
        ":constants",
        "//formats:assessor",
        "@abseil-cpp//absl/status",
        "@abseil-cpp//absl/status:statusor",
        "@riegeli//riegeli/bytes:reader",
    ],
)

cc_test(
    name = "assessor_test",
    srcs = ["assessor_test.cc"],
    deps = [
        ":assessor",
        ":constants",
        "@abseil-cpp//absl/status",
        "@abseil-cpp//absl/status:status_matchers",
        "@abseil-cpp//absl/strings",
        "@googletest//:gtest_main",
        "@riegeli//riegeli/bytes:string_reader",
    ],
)

cc_library(
    name = "format",
    srcs = ["format.cc"],
    hdrs = ["format.h"],
    deps = [
        ":assessor",
        ":extractor",
        "//formats:format",
        "@abseil-cpp//absl/status:statusor",
    ],
)
