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

#ifndef THIRD_PARTY_CREDENTIO_FORMATS_PDF_OBJECT_WRITER_H_
#define THIRD_PARTY_CREDENTIO_FORMATS_PDF_OBJECT_WRITER_H_

#include <cstdint>

#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "formats/pdf/objects.h"
#include "riegeli/bytes/writer.h"

namespace credentio {

// Writes the given object to the output at the current position.
absl::Status WriteObject(const Object& obj, riegeli::Writer& output);

// Writes the given indirect object to the output at the current position.
absl::Status WriteIndirectObject(const IndirectObject& obj,
                                 riegeli::Writer& output,
                                 bool is_measurement = false);

// Computes the size of the "header" of an indirect stream object in bytes. The
// "header" refers to all the content written for an indirect stream object
// before the actual stream data begins.
absl::StatusOr<int64_t> ComputeIndirectStreamHeaderByteSize(
    const IndirectObject& indirect_stream_obj);

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_FORMATS_PDF_OBJECT_WRITER_H_
