#pragma once
#ifndef C_WORKLOAD_H
#define C_WORKLOAD_H
#include <stdint.h>
#include <stdbool.h>
#define FDB_WORKLOAD_API_VERSION 1
typedef struct FDB_future FDBFuture;
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;
struct FDBString_VT {
void (*free)(const char* inner);
}* vt;
} FDBString;
typedef struct FDBMetrics {
OpaqueMetrics* inner;
struct FDBMetrics_VT {
void (*reserve)(OpaqueMetrics* inner, int n);
void (*push)(OpaqueMetrics* inner, FDBMetric val);
}* vt;
} FDBMetrics;
typedef struct FDBPromise {
OpaquePromise* inner;
struct FDBPromise_VT {
void (*free)(OpaquePromise* inner);
void (*send)(OpaquePromise* inner, bool val);
}* vt;
} FDBPromise;
typedef struct FDBWorkloadContext {
int api_version;
OpaqueWorkloadContext* inner;
struct FDBWorkloadContext_VT {
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);
FDBFuture* (*delay)(OpaqueWorkloadContext* inner, double seconds);
}* vt;
} FDBWorkloadContext;
typedef struct FDBWorkload {
int api_version;
OpaqueWorkload* inner;
struct FDBWorkload_VT {
void (*free)(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);
}* vt;
} FDBWorkload;
FDBWorkload workloadCFactory(const char* name, FDBWorkloadContext context);
#endif