summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorꦌꦫꦶꦏ꧀ꦦꦿꦧꦮꦑꦩꦭ꧀ <erik@darapsa.co.id>2022-10-09 15:45:41 +0800
committerꦌꦫꦶꦏ꧀ꦦꦿꦧꦮꦑꦩꦭ꧀ <erik@darapsa.co.id>2022-10-09 15:45:41 +0800
commit90f6ec9059362bb5db7964973f38109e6aa12b17 (patch)
treeb5ae7b122d9ca938ec862901ac256ec7dee15861
parent21b0c331eddea2aac6b97bce7229008deb9969df (diff)
Replace switch & enum with generic selections
-rw-r--r--midtrans.c53
-rw-r--r--midtrans.h24
2 files changed, 28 insertions, 49 deletions
diff --git a/midtrans.c b/midtrans.c
index 2673292..a9eb3d7 100644
--- a/midtrans.c
+++ b/midtrans.c
@@ -105,44 +105,34 @@ void midtrans_status(const char *order_id)
pthread_create(&threads[num_threads - 1], NULL, request, NULL);
}
-void midtrans_charge(enum midtrans_payment type, void *object,
- struct midtrans_transaction *transaction,
- char *custom_fields[])
+void midtrans_charge_banktransfer(struct midtrans_banktransfer *banktransfer,
+ struct midtrans_transaction *transaction, char *custom_fields[])
{
static const char *url_tmpl = "%scharge";
char url[strlen(url_tmpl) - strlen("%s") + strlen(base_url) + 1];
sprintf(url, url_tmpl, base_url);
curl_easy_setopt(curl, CURLOPT_URL, url);
- size_t payment_len = 0;
- char *payment = NULL;
- switch (type) {
- case MIDTRANS_BANKTRANSFER:
- default:
- ;
- struct midtrans_banktransfer *banktransfer = object;
- static const char *va_number_tmpl = ",\n"
- "\t\t\"va_number\": \"%s\"";
- size_t va_number_len = 0;
- char *va_number = NULL;
- if (banktransfer->va_number) {
- va_number_len = strlen(va_number_tmpl)
- - strlen("%s") +
- strlen(banktransfer->va_number);
- va_number = malloc(va_number_len + 1);
- sprintf(va_number, va_number_tmpl,
- banktransfer->va_number);
- }
- static const char *payment_tmpl = "bank_transfer\",\n"
- "\t\"bank_transfer\": {\n"
- "\t\t\"bank\": \"%s\"%s";
- payment_len = strlen(payment_tmpl) - strlen("%s") * 2
- + va_number_len + strlen(banktransfer->bank);
- payment = malloc(payment_len + 1);
- sprintf(payment, payment_tmpl, banktransfer->bank,
- va_number_len ? va_number : "");
- break;
+ static const char *va_number_tmpl = ",\n"
+ "\t\t\"va_number\": \"%s\"";
+ size_t va_number_len = 0;
+ char *va_number = NULL;
+ if (banktransfer->va_number) {
+ va_number_len = strlen(va_number_tmpl) - strlen("%s")
+ + strlen(banktransfer->va_number);
+ va_number = malloc(va_number_len + 1);
+ sprintf(va_number, va_number_tmpl, banktransfer->va_number);
}
+
+ static const char *payment_tmpl = "bank_transfer\",\n"
+ "\t\"bank_transfer\": {\n"
+ "\t\t\"bank\": \"%s\"%s";
+ const size_t payment_len = strlen(payment_tmpl) - strlen("%s") * 2
+ + va_number_len + strlen(banktransfer->bank);
+ char *payment = malloc(payment_len + 1);
+ sprintf(payment, payment_tmpl, banktransfer->bank,
+ va_number_len ? va_number : "");
+
size_t i = 0;
size_t fields_len = 0;
char *fields = NULL;
@@ -160,6 +150,7 @@ void midtrans_charge(enum midtrans_payment type, void *object,
fields_len += field_len;
i += 2;
}
+
static const char *post_tmpl =
"{\n"
"\t\"payment_type\": \"%s"
diff --git a/midtrans.h b/midtrans.h
index 181e73c..bd03076 100644
--- a/midtrans.h
+++ b/midtrans.h
@@ -6,23 +6,6 @@ struct midtrans_transaction {
long gross_amount;
};
-enum midtrans_payment {
- MIDTRANS_CREDITCARD = 0,
- MIDTRANS_BANKTRANSFER,
- MIDTRANS_BCA_KLIKBCA,
- MIDTRANS_BCA_KLIKPAY,
- MIDTRANS_BRI_EPAY,
- MIDTRANS_CIMB_CLICKS,
- MIDTRANS_DANAMON_ONLINE,
- MIDTRANS_UOB_EZPAY,
- MIDTRANS_QRIS,
- MIDTRANS_GOPAY,
- MIDTRANS_SHOPEEPAY,
- MIDTRANS_CSTORE,
- MIDTRANS_AKULAKU,
- MIDTRANS_KREDIVO
-};
-
struct midtrans_banktransfer {
char *bank;
char *va_number;
@@ -30,13 +13,18 @@ struct midtrans_banktransfer {
char *permata;
};
+#define midtrans_charge(x, y, z) _Generic((x),\
+ struct midtrans_banktransfer *:\
+ midtrans_charge_banktransfer(x, y, z)\
+ )
+
#ifdef __cplusplus
extern "C" {
#endif
void midtrans_init(const char *api_key, const char *cainfo);
void midtrans_status(const char *order_id);
-void midtrans_charge(enum midtrans_payment type, void *payment,
+void midtrans_charge_banktransfer(struct midtrans_banktransfer *banktransfer,
struct midtrans_transaction *transaction,
char *custom_fields[]);
void midtrans_cleanup();