Last active
September 28, 2022 09:04
-
-
Save azkadev/278325d9adb7f857c004fac5419a90bb to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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