blob: ce72b5fcab531dec1dfaf9fdc01959faaa3ea9ea [file]
// 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_