// Copyright 2021 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// THIS CODE IS GENERATED.
// Generated with command:
// ./proto_print.py --subdir common --proto-include attestation/proto_bindings
// ../../system_api/dbus/attestation/interface.proto

#ifndef ATTESTATION_COMMON_PRINT_INTERFACE_PROTO_H_
#define ATTESTATION_COMMON_PRINT_INTERFACE_PROTO_H_

#include <string>

#include <brillo/brillo_export.h>

#include "attestation/proto_bindings/interface.pb.h"

namespace attestation {

std::string GetProtoDebugStringWithIndent(AttestationStatus value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(AttestationStatus value);
std::string GetProtoDebugStringWithIndent(ACAType value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(ACAType value);
std::string GetProtoDebugStringWithIndent(VAType value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(VAType value);
std::string GetProtoDebugStringWithIndent(DeleteKeysRequest_MatchBehavior value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    DeleteKeysRequest_MatchBehavior value);
std::string GetProtoDebugStringWithIndent(const GetKeyInfoRequest& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(const GetKeyInfoRequest& value);
std::string GetProtoDebugStringWithIndent(const GetKeyInfoReply& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(const GetKeyInfoReply& value);
std::string GetProtoDebugStringWithIndent(
    const GetEndorsementInfoRequest& value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const GetEndorsementInfoRequest& value);
std::string GetProtoDebugStringWithIndent(const GetEndorsementInfoReply& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const GetEndorsementInfoReply& value);
std::string GetProtoDebugStringWithIndent(
    const GetAttestationKeyInfoRequest& value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const GetAttestationKeyInfoRequest& value);
std::string GetProtoDebugStringWithIndent(
    const GetAttestationKeyInfoReply& value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const GetAttestationKeyInfoReply& value);
std::string GetProtoDebugStringWithIndent(
    const ActivateAttestationKeyRequest& value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const ActivateAttestationKeyRequest& value);
std::string GetProtoDebugStringWithIndent(
    const ActivateAttestationKeyReply& value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const ActivateAttestationKeyReply& value);
std::string GetProtoDebugStringWithIndent(
    const CreateCertifiableKeyRequest& value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const CreateCertifiableKeyRequest& value);
std::string GetProtoDebugStringWithIndent(
    const CreateCertifiableKeyReply& value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const CreateCertifiableKeyReply& value);
std::string GetProtoDebugStringWithIndent(const DecryptRequest& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(const DecryptRequest& value);
std::string GetProtoDebugStringWithIndent(const DecryptReply& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(const DecryptReply& value);
std::string GetProtoDebugStringWithIndent(const SignRequest& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(const SignRequest& value);
std::string GetProtoDebugStringWithIndent(const SignReply& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(const SignReply& value);
std::string GetProtoDebugStringWithIndent(
    const RegisterKeyWithChapsTokenRequest& value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const RegisterKeyWithChapsTokenRequest& value);
std::string GetProtoDebugStringWithIndent(
    const RegisterKeyWithChapsTokenReply& value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const RegisterKeyWithChapsTokenReply& value);
std::string GetProtoDebugStringWithIndent(
    const GetEnrollmentPreparationsRequest& value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const GetEnrollmentPreparationsRequest& value);
std::string GetProtoDebugStringWithIndent(
    const GetEnrollmentPreparationsReply& value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const GetEnrollmentPreparationsReply& value);
std::string GetProtoDebugStringWithIndent(const GetStatusRequest& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(const GetStatusRequest& value);
std::string GetProtoDebugStringWithIndent(const GetStatusReply::Identity& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const GetStatusReply::Identity& value);
std::string GetProtoDebugStringWithIndent(
    const GetStatusReply::IdentityCertificate& value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const GetStatusReply::IdentityCertificate& value);
std::string GetProtoDebugStringWithIndent(const GetStatusReply& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(const GetStatusReply& value);
std::string GetProtoDebugStringWithIndent(const VerifyRequest& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(const VerifyRequest& value);
std::string GetProtoDebugStringWithIndent(const VerifyReply& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(const VerifyReply& value);
std::string GetProtoDebugStringWithIndent(
    const CreateEnrollRequestRequest& value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const CreateEnrollRequestRequest& value);
std::string GetProtoDebugStringWithIndent(const CreateEnrollRequestReply& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const CreateEnrollRequestReply& value);
std::string GetProtoDebugStringWithIndent(const FinishEnrollRequest& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(const FinishEnrollRequest& value);
std::string GetProtoDebugStringWithIndent(const FinishEnrollReply& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(const FinishEnrollReply& value);
std::string GetProtoDebugStringWithIndent(const EnrollRequest& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(const EnrollRequest& value);
std::string GetProtoDebugStringWithIndent(const EnrollReply& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(const EnrollReply& value);
std::string GetProtoDebugStringWithIndent(
    const CreateCertificateRequestRequest& value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const CreateCertificateRequestRequest& value);
std::string GetProtoDebugStringWithIndent(
    const CreateCertificateRequestReply& value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const CreateCertificateRequestReply& value);
std::string GetProtoDebugStringWithIndent(
    const FinishCertificateRequestRequest& value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const FinishCertificateRequestRequest& value);
std::string GetProtoDebugStringWithIndent(
    const FinishCertificateRequestReply& value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const FinishCertificateRequestReply& value);
std::string GetProtoDebugStringWithIndent(const GetCertificateRequest& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const GetCertificateRequest& value);
std::string GetProtoDebugStringWithIndent(const GetCertificateReply& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(const GetCertificateReply& value);
std::string GetProtoDebugStringWithIndent(
    const SignEnterpriseChallengeRequest& value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const SignEnterpriseChallengeRequest& value);
std::string GetProtoDebugStringWithIndent(
    const SignEnterpriseChallengeReply& value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const SignEnterpriseChallengeReply& value);
std::string GetProtoDebugStringWithIndent(
    const SignSimpleChallengeRequest& value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const SignSimpleChallengeRequest& value);
std::string GetProtoDebugStringWithIndent(const SignSimpleChallengeReply& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const SignSimpleChallengeReply& value);
std::string GetProtoDebugStringWithIndent(const SetKeyPayloadRequest& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const SetKeyPayloadRequest& value);
std::string GetProtoDebugStringWithIndent(const SetKeyPayloadReply& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(const SetKeyPayloadReply& value);
std::string GetProtoDebugStringWithIndent(const DeleteKeysRequest& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(const DeleteKeysRequest& value);
std::string GetProtoDebugStringWithIndent(const DeleteKeysReply& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(const DeleteKeysReply& value);
std::string GetProtoDebugStringWithIndent(const ResetIdentityRequest& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const ResetIdentityRequest& value);
std::string GetProtoDebugStringWithIndent(const ResetIdentityReply& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(const ResetIdentityReply& value);
std::string GetProtoDebugStringWithIndent(const GetEnrollmentIdRequest& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const GetEnrollmentIdRequest& value);
std::string GetProtoDebugStringWithIndent(const GetEnrollmentIdReply& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const GetEnrollmentIdReply& value);
std::string GetProtoDebugStringWithIndent(
    const GetCertifiedNvIndexRequest& value, int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const GetCertifiedNvIndexRequest& value);
std::string GetProtoDebugStringWithIndent(const GetCertifiedNvIndexReply& value,
                                          int indent_size);
BRILLO_EXPORT std::string GetProtoDebugString(
    const GetCertifiedNvIndexReply& value);

}  // namespace attestation

#endif  // ATTESTATION_COMMON_PRINT_INTERFACE_PROTO_H_
