From 90f6ec9059362bb5db7964973f38109e6aa12b17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=A6=8C=EA=A6=AB=EA=A6=B6=EA=A6=8F=EA=A7=80=EA=A6=A6?= =?UTF-8?q?=EA=A6=BF=EA=A6=A7=EA=A6=AE=EA=A6=91=EA=A6=A9=EA=A6=AD=EA=A7=80?= Date: Sun, 9 Oct 2022 15:45:41 +0800 Subject: Replace switch & enum with generic selections --- midtrans.c | 53 ++++++++++++++++++++++------------------------------- midtrans.h | 24 ++++++------------------ 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(); -- cgit v1.2.3