// 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_JUMBF_INTERNAL_SERIALIZATION_UTILS_H_
#define THIRD_PARTY_CREDENTIO_JUMBF_INTERNAL_SERIALIZATION_UTILS_H_

#include <climits>
#include <cstddef>
#include <cstdint>

#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/cord.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
#include "riegeli/bytes/backward_writer.h"
#include "riegeli/endian/endian_reading.h"

static_assert(CHAR_BIT == 8);

namespace jumbf_internal {

// Consumes any integer type that is supported by riegeli::ReadBigEndian.
template <typename T>
absl::StatusOr<T> ConsumeInteger(absl::string_view* sv) {
  if (sv->length() < sizeof(T)) {
    return absl::OutOfRangeError(
        absl::StrCat("not enough input bytes remaining; have ", sv->length(),
                     " need ", sizeof(T)));
  }

  T value = riegeli::ReadBigEndian<T>(sv->data());
  sv->remove_prefix(sizeof(T));

  return value;
}

// Consumes a null terminated string from within `sv`. The string's null
// terminator must be inside the usable range of `sv`.
absl::StatusOr<absl::string_view> ConsumeNullTerminated(absl::string_view* sv);

// Consumes the first `n` bytes of `sv`.
absl::StatusOr<absl::string_view> ConsumeBytes(absl::string_view* sv, size_t n);

// Writes `contents` to `writer`.
absl::Status WriteRaw(absl::Cord content, riegeli::BackwardWriter* writer);

// Writes `content` to `writer`, appending a NUL terminator.
absl::Status WriteNulTerminated(absl::Cord content,
                                riegeli::BackwardWriter* writer);

// Writes `n` to `writer`. Only types with explicit template specializations
// are supported.
template <typename T>
absl::Status WriteInteger(T n, riegeli::BackwardWriter* writer);

// Writes `length` zero bytes to `writer`.
absl::Status WritePadding(uint64_t length, riegeli::BackwardWriter* writer);

}  // namespace jumbf_internal

#endif  // THIRD_PARTY_CREDENTIO_JUMBF_INTERNAL_SERIALIZATION_UTILS_H_
