blob: 70b05244947448bd6cc5f652228500526246ed23 [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.
//
#include "assertion/assertion_encoder.h"
#include <utility>
#include "absl/base/no_destructor.h"
#include "absl/status/status.h"
#include "absl/status/status_macros.h"
#include "absl/status/statusor.h"
#include "absl/strings/cord.h"
#include "absl/strings/string_view.h"
#include "cbor/options.h"
#include "jumbf/box_builder.h"
#include "jumbf/constants.h"
#include "proto/actions_assertion.cbor.h"
#include "proto/actions_assertion.pb.h"
#include "proto/assertion.pb.h"
#include "proto/bmff_based_hash_assertion.cbor.h"
#include "proto/bmff_based_hash_assertion.pb.h"
#include "proto/boxes_hash_assertion.cbor.h"
#include "proto/boxes_hash_assertion.pb.h"
#include "proto/collection_data_hash_assertion.cbor.h"
#include "proto/collection_data_hash_assertion.pb.h"
#include "proto/data_hash_assertion.cbor.h"
#include "proto/data_hash_assertion.pb.h"
#include "proto/ingredient_assertion.cbor.h"
#include "proto/ingredient_assertion.pb.h"
#include "proto/multi_asset_hash_assertion.cbor.h"
namespace credentio {
namespace {
template <typename ProtoType>
absl::StatusOr<absl::Cord> EncodeProtoToCbor(
const ProtoType& proto, const cbor::FromProtoOptions& options) {
ABSL_ASSIGN_OR_RETURN(auto cbor, cbor::FromProto(proto, options));
return absl::Cord(cbor->toString());
}
} // namespace
absl::StatusOr<absl::Cord> StandardAssertionEncoder::ToCbor(
const Assertion& assertion) const {
if (assertion.has_actions()) {
return EncodeProtoToCbor(assertion.actions(), options_);
}
if (assertion.has_bmff_based_hash()) {
return EncodeProtoToCbor(assertion.bmff_based_hash(), options_);
}
if (assertion.has_data_hash()) {
return EncodeProtoToCbor(assertion.data_hash(), options_);
}
if (assertion.has_collection_data_hash()) {
return EncodeProtoToCbor(assertion.collection_data_hash(), options_);
}
if (assertion.has_ingredient_v3()) {
return EncodeProtoToCbor(assertion.ingredient_v3(), options_);
}
if (assertion.has_boxes_hash()) {
return EncodeProtoToCbor(assertion.boxes_hash(), options_);
}
if (assertion.has_multi_asset_hash()) {
return EncodeProtoToCbor(assertion.multi_asset_hash(), options_);
}
return absl::InvalidArgumentError("Assertion not supported.");
}
absl::StatusOr<jumbf::BuiltSuperBox> AssertionEncoder::ToJumbf(
const Assertion& assertion) const {
ABSL_ASSIGN_OR_RETURN(absl::Cord cbor_data, ToCbor(assertion));
jumbf::SuperBoxBuilder assertion_builder(
jumbf::kCborBoxTypeUuid, {.label = absl::Cord(assertion.label())});
ABSL_RETURN_IF_ERROR(
assertion_builder.AddContent(jumbf::kCborBoxType, std::move(cbor_data)));
return std::move(assertion_builder).Finalize(); // NOLINT: rvalue method call
}
const AssertionEncoder& GetAssertionEncoder(
bool skip_validity_checks_for_test) {
static const absl::NoDestructor<StandardAssertionEncoder> encoder_for_test(
/*skip_validity_checks_for_test=*/true);
static const absl::NoDestructor<StandardAssertionEncoder> encoder(
/*skip_validity_checks_for_test=*/false);
return skip_validity_checks_for_test ? *encoder_for_test : *encoder;
}
} // namespace credentio