encode function
Implementation
dynamic encode(
Map<String, Object> typeTable,
String path,
Object type,
Object? value,
) {
if (type is EnumTypeDescription) {
if (!type.enumValues.contains(value) || value == null) {
throw SdkgenTypeException(
'Invalid Type at \'$path\', expected ${type.type}, got ${jsonEncode(value)}');
}
return type.stringValues[type.enumValues.indexOf(value)];
} else if (type is StructTypeDescription) {
if (value.runtimeType != type.type) {
throw SdkgenTypeException(
'Invalid Type at \'$path\', expected ${type.type}, got ${jsonEncode(value)}');
}
final map =
Function.apply(type.exportAsMap, [value]) as Map<String, Object?>;
final resultMap = {};
map.forEach((fieldName, fieldValue) {
resultMap[fieldName] = encode(
typeTable,
'$path.$fieldName',
type.fields[fieldName]!,
fieldValue,
);
});
return resultMap;
} else if (type is String) {
if (type.endsWith('?')) {
if (value == null) {
return null;
} else {
return encode(
typeTable,
path,
type.substring(0, type.length - 1),
value,
);
}
} else if (type.endsWith('[]')) {
if (value is! List) {
throw SdkgenTypeException(
'Invalid Type at \'$path\', expected ${jsonEncode(type)}, got ${jsonEncode(value)}');
}
return value
.asMap()
.entries
.map((entry) => encode(
typeTable,
'$path[${entry.key}]',
type.substring(0, type.length - 2),
entry.value,
))
.toList();
} else {
switch (type) {
case 'bytes':
if (value is! List<int>) {
throw SdkgenTypeException(
'Invalid Type at \'$path\', expected ${jsonEncode(type)}, got ${jsonEncode(value)}');
}
return Base64Encoder().convert(value);
case 'bigint':
if (value is! BigInt) {
throw SdkgenTypeException(
'Invalid Type at \'$path\', expected ${jsonEncode(type)}, got ${jsonEncode(value)}');
}
return value.toString();
case 'date':
if (value is! DateTime) {
throw SdkgenTypeException(
'Invalid Type at \'$path\', expected ${jsonEncode(type)}, got ${jsonEncode(value)}');
}
return value.toIso8601String().split('T')[0];
case 'datetime':
if (value is! DateTime) {
throw SdkgenTypeException(
'Invalid Type at \'$path\', expected ${jsonEncode(type)}, got ${jsonEncode(value)}');
}
return value.toUtc().toIso8601String().replaceAll('Z', '');
case 'decimal':
if (value is Decimal) {
return value.toString();
}
if (value is! num &&
(value is! String ||
!RegExp(r'^-?[0-9]+(?:\.[0-9]+)?$').hasMatch(value))) {
throw SdkgenTypeException(
'Invalid Type at \'$path\', expected ${jsonEncode(type)}, got ${jsonEncode(value)}');
}
return Decimal.parse("$value").toString();
default:
if (simpleTypes.contains(type)) {
return simpleEncodeDecode(typeTable, path, type, value);
} else if (typeTable.containsKey(type)) {
return encode(typeTable, path, typeTable[type]!, value);
} else {
throw SdkgenTypeException(
'Unknown type \'${jsonEncode(type)}\' at \'$path\'');
}
}
}
} else {
throw SdkgenTypeException(
'Unknown type \'${jsonEncode(type)}\' at \'$path\'');
}
}