#pragma once
#ifndef C_WORKLOAD_H
#define C_WORKLOAD_H
#include <stdint.h>
#include <stdbool.h>
typedef struct FDB_database FDBDatabase;
typedef struct Opaque_promise OpaquePromise;
typedef struct Opaque_workload OpaqueWorkload;
typedef struct Opaque_workloadContext OpaqueWorkloadContext;
typedef struct Opaque_metrics OpaqueMetrics;
typedef enum FDBSeverity {
FDBSeverity_Debug,
FDBSeverity_Info,
FDBSeverity_Warn,
FDBSeverity_WarnAlways,
FDBSeverity_Error,
} FDBSeverity;
typedef struct FDBStringPair {
const char* key;
const char* val;
} FDBStringPair;
typedef struct FDBMetric {
const char* key;
const char* fmt;
double val;
bool avg;
} FDBMetric;
typedef struct FDBString {
const char* inner;
void (*free)(const char* inner);
} FDBString;
typedef struct FDBMetrics {
OpaqueMetrics* inner;
void (*reserve)(OpaqueMetrics* inner, int n);
void (*push)(OpaqueMetrics* inner, FDBMetric val);
} FDBMetrics;
typedef struct FDBPromise {
OpaquePromise* inner;
void (*send)(OpaquePromise* inner, bool val);
void (*free)(OpaquePromise* inner);
} FDBPromise;
typedef struct FDBWorkloadContext {
OpaqueWorkloadContext* inner;
void (*trace)(OpaqueWorkloadContext* inner, FDBSeverity sev, const char* name, const FDBStringPair* details, int n);
uint64_t (*getProcessID)(OpaqueWorkloadContext* inner);
void (*setProcessID)(OpaqueWorkloadContext* inner, uint64_t processID);
double (*now)(OpaqueWorkloadContext* inner);
uint32_t (*rnd)(OpaqueWorkloadContext* inner);
FDBString (*getOption)(OpaqueWorkloadContext* inner, const char* name, const char* defaultValue);
int (*clientId)(OpaqueWorkloadContext* inner);
int (*clientCount)(OpaqueWorkloadContext* inner);
int64_t (*sharedRandomNumber)(OpaqueWorkloadContext* inner);
} FDBWorkloadContext;
typedef struct FDBWorkload {
OpaqueWorkload* inner;
void (*setup)(OpaqueWorkload* inner, FDBDatabase* db, FDBPromise done);
void (*start)(OpaqueWorkload* inner, FDBDatabase* db, FDBPromise done);
void (*check)(OpaqueWorkload* inner, FDBDatabase* db, FDBPromise done);
void (*getMetrics)(OpaqueWorkload* inner, FDBMetrics out);
double (*getCheckTimeout)(OpaqueWorkload* inner);
void (*free)(OpaqueWorkload* inner);
} FDBWorkload;
#endif