// 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 "claim/claim_cbor_encoder.h"

#include <string>

#include "absl/base/no_destructor.h"
#include "absl/status/status.h"
#include "absl/status/status_macros.h"
#include "absl/status/statusor.h"
#include "cbor/options.h"
#include "proto/manifest.cbor.h"
#include "proto/manifest.pb.h"

namespace credentio {
namespace {

class StandardClaimCborEncoder : public ClaimCborEncoder {
 public:
  StandardClaimCborEncoder() = default;
  ~StandardClaimCborEncoder() override = default;

  absl::StatusOr<std::string> ToCbor(const Claim& claim) const override {
    ABSL_ASSIGN_OR_RETURN(auto cbor, cbor::FromProto(claim, options_));
    return cbor->toString();
  }

 private:
  cbor::FromProtoOptions options_;
};

}  // namespace

const ClaimCborEncoder& GetClaimCborEncoder() {
  static const absl::NoDestructor<StandardClaimCborEncoder> encoder;
  return *encoder;
}

}  // namespace credentio
