#ifndef REFTABLE_FSCK_H
#define REFTABLE_FSCK_H

#include "reftable-system.h"
#include "reftable-stack.h"

enum reftable_fsck_error {
	/* Invalid table name */
	REFTABLE_FSCK_ERROR_TABLE_NAME = 0,
	/* Used for bounds checking, must be last */
	REFTABLE_FSCK_MAX_VALUE,
};

/* Represents an individual error encountered during the FSCK checks. */
struct reftable_fsck_info {
	enum reftable_fsck_error error;
	const char *msg;
	const char *path;
};

typedef int reftable_fsck_report_fn(struct reftable_fsck_info *info,
				    void *cb_data);
typedef void reftable_fsck_verbose_fn(const char *msg, void *cb_data);

/*
 * Given a reftable stack, perform consistency checks on the stack.
 *
 * If an issue is encountered, the issue is reported to the callee via the
 * provided 'report_fn'. If the issue is non-recoverable the flow will not
 * continue. If it is recoverable, the flow will continue and further issues
 * will be reported as identified.
 *
 * The 'verbose_fn' will be invoked to provide verbose information about
 * the progress and state of the consistency checks.
 */
int reftable_fsck_check(struct reftable_stack *stack,
			reftable_fsck_report_fn report_fn,
			reftable_fsck_verbose_fn verbose_fn,
			void *cb_data);

#endif /* REFTABLE_FSCK_H */
