Skip to content

Instantly share code, notes, and snippets.

@azkadev
Last active September 28, 2022 09:04
Show Gist options
  • Save azkadev/278325d9adb7f857c004fac5419a90bb to your computer and use it in GitHub Desktop.
Save azkadev/278325d9adb7f857c004fac5419a90bb to your computer and use it in GitHub Desktop.
// ignore_for_file: unnecessary_brace_in_string_interps
import 'dart:convert';
//import 'package:utility/utility.dart';
void main() {
var str = jsonToDart({
"external_id": "external_id",
"status": "PENDING",
"merchant_name": "HEXAMINATE",
"merchant_profile_picture_url": "https://xnd-merchant-logos.s3.amazonaws.com/business/production/610836e3824b6140a513dc38-1648053563560.png",
"amount": 50000,
"payer_email": null,
"description": null,
"invoice_url": "https://checkout-staging.xendit.co/web/63330d7c3f567d23a47341ae",
"expiry_date": "2022-09-28T14:49:32.066Z",
"available_banks": [
{
"bank_code": "MANDIRI",
"collection_type": "POOL",
"transfer_amount": 50000,
"bank_branch": "Virtual Account",
"account_holder_name": "HEXAMINATE",
"bank_account_number": null
},
{
"bank_code": "BRI",
"collection_type": "POOL",
"transfer_amount": 50000,
"bank_branch": "Virtual Account",
"account_holder_name": "HEXAMINATE",
"bank_account_number": null
},
{
"bank_code": "BNI",
"collection_type": "POOL",
"transfer_amount": 50000,
"bank_branch": "Virtual Account",
"account_holder_name": "HEXAMINATE",
"bank_account_number": null
},
{
"bank_code": "PERMATA",
"collection_type": "POOL",
"transfer_amount": 50000,
"bank_branch": "Virtual Account",
"account_holder_name": "HEXAMINATE",
"bank_account_number": null
},
{
"bank_code": "BCA",
"collection_type": "POOL",
"transfer_amount": 50000,
"bank_branch": "Virtual Account",
"account_holder_name": "HEXAMINATE",
"bank_account_number": null
}
],
"available_retail_outlets": [
{
"retail_outlet_name": "ALFAMART",
"payment_code": null,
"transfer_amount": null
},
{
"retail_outlet_name": "INDOMARET",
"payment_code": null,
"transfer_amount": null
}
],
"available_paylaters": [],
"should_exclude_credit_card": false,
"should_send_email": false,
"created": "2022-09-27T14:49:32.785Z",
"updated": "2022-09-27T14:49:32.785Z",
"mid_label": null,
"currency": "IDR",
"fixed_va": null,
"locale": null,
"items": null,
"fees": null
}, className: "Azka");
}
String jsonToDart(Map<String, dynamic> data, {String className = "Root", bool isMain = true, bool isUseClassName = false}) {
List<String> classMessages = [];
String classMessage = """
// ignore_for_file: non_constant_identifier_names
${((isMain) ? "import 'dart:convert';" : "")}
class ${className} {
late Map rawData;
${className}(this.rawData);
""";
data.forEach((key, value) {
String nameClass = key.camelCaseClass();
if (isUseClassName) {
nameClass = "${className}${key.camelCaseClass()}";
}
if (value is String) {
classMessage += textToFunction(key: key, className: className, returnType: "String");
}
if (value is int) {
classMessage += textToFunction(key: key, className: className, returnType: "int");
} else if (value is double) {
classMessage += textToFunction(key: key, className: className, returnType: "double");
} else if (value is num) {
classMessage += textToFunction(key: key, className: className, returnType: "num");
}
if (value is bool) {
classMessage += textToFunction(key: key, className: className, returnType: "bool");
}
if (value is Map) {
classMessage += textToFunction(
key: key,
className: className,
returnType: "Map",
isClass: true,
isUseClassName: isUseClassName,
);
classMessages.add(jsonToDart(value.cast<String, dynamic>(), className: nameClass, isMain: false, isUseClassName: isUseClassName));
}
if (value is List) {
if (value.isNotEmpty) {
if (value.first is Map) {
classMessage += textToFunction(
key: key,
className: className,
returnType: "Map",
isClass: true,
isUseClassName: isUseClassName,
isList: true,
);
classMessages.add(jsonToDart((value.first as Map).cast<String, dynamic>(), className: nameClass, isMain: false, isUseClassName: isUseClassName));
}
if (value.first is bool) {
classMessage += textToFunction(key: key, className: className, returnType: "bool", isClass: false, isList: true);
}
if (value.first is String) {
classMessage += textToFunction(key: key, className: className, returnType: "String", isClass: false, isList: true);
}
if (value.first is int) {
classMessage += textToFunction(key: key, className: className, returnType: "int", isClass: false, isList: true);
} else if (value.first is double) {
classMessage += textToFunction(key: key, className: className, returnType: "double", isClass: false, isList: true);
} else if (value.first is num) {
classMessage += textToFunction(key: key, className: className, returnType: "num", isClass: false, isList: true);
}
if (value.first == null) {
classMessage += textToFunction(key: key, className: className, returnType: "Object", isClass: false, isList: true);
}
} else {
classMessage += textToFunction(key: key, className: className, returnType: "Object", isClass: false, isList: true);
}
}
if (value == null) {
classMessage += textToFunction(
key: key,
className: className,
returnType: "Object",
isClass: false,
isList: false,
);
}
});
classMessage += """
Map toMap() {
return rawData;
}
Map toJson() {
return rawData;
}
@override
String toString() {
return json.encode(rawData);
}
}""";
classMessage += "\n\n${classMessages.join("\n\n")}";
return classMessage;
}
String textToFunction({
required String key,
required String returnType,
required String className,
bool isClass = false,
bool isList = false,
bool isUseClassName = false,
}) {
String nameClass = key.camelCaseClass();
if (isUseClassName) {
nameClass = "${className}${key.camelCaseClass()}";
}
String nameMethod = key.replaceAll(RegExp(r"^(@|[0-9]+)", caseSensitive: false), "_");
if (isClass) {
if (isList) {
return """
List<${nameClass}?>? get ${nameMethod} {
try {
if (rawData["$key"] is List == false){
return null;
}
return (rawData["$key"] as List).map((e) => ${nameClass}(e as $returnType)).toList().cast<${nameClass}>();
} catch (e) {
return null;
}
}
""";
}
return """
${nameClass}? get ${nameMethod} {
try {
if (rawData["$key"] is $returnType == false){
return null;
}
return ${nameClass}(rawData["$key"] as $returnType);
} catch (e) {
return null;
}
}
""";
}
if (isList) {
return """
List<${returnType}?>? get ${nameMethod} {
try {
if (rawData["$key"] is List == false){
return null;
}
return (rawData["$key"] as List).cast<${returnType}>();
} catch (e) {
return null;
}
}
""";
}
return """
$returnType? get ${nameMethod} {
try {
if (rawData["$key"] is $returnType == false){
return null;
}
return rawData["$key"] as $returnType;
} catch (e) {
return null;
}
}
""";
}
extension JsonToClassStringExtensions on String {
String camelCaseClass({RegExp? regExp}) {
regExp ??= RegExp(r"(_)", caseSensitive: false);
String text = "";
for (var i = 0; i < length; i++) {
var loopData = this[i];
if (i == 0) {
text += loopData.toUpperCase();
} else {
if (regExp.hasMatch(text[text.length - 1])) {
text += loopData.toUpperCase();
} else {
text += loopData;
}
}
}
return text.replaceAll(regExp, "");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment