dynamic
parse(ClassMirror intoType, Request request)
Source
@override
dynamic parse(ClassMirror intoType, Request request) {
if (request.body.isEmpty) {
return null;
}
if (intoType.isAssignableTo(reflectType(HTTPSerializable))) {
if (!reflectType(request.body.decodedType)
.isSubtypeOf(reflectType(Map))) {
throw new HTTPResponseException(
400, "Expected Map, got ${request.body.decodedType}");
}
var value = intoType.newInstance(new Symbol(""), []).reflectee
as HTTPSerializable;
value.readFromMap(request.body.asMap());
return value;
} else if (intoType.isSubtypeOf(reflectType(List))) {
if (!reflectType(request.body.decodedType)
.isSubtypeOf(reflectType(List))) {
throw new HTTPResponseException(
400, "Expected List, got ${request.body.decodedType}");
}
var bodyList = request.body.asList();
if (bodyList.isEmpty) {
return [];
}
var typeArg = intoType.typeArguments.first as ClassMirror;
return bodyList.map((object) {
if (!reflectType(object.runtimeType).isSubtypeOf(reflectType(Map))) {
throw new HTTPResponseException(
400, "Expected List<Map>, got List<${object.runtimeType}>");
}
var value = typeArg.newInstance(new Symbol(""), []).reflectee
as HTTPSerializable;
value.readFromMap(object);
return value;
}).toList();
}
throw new _HTTPBodyBindingException(
"Failed to bind HTTPBody: ${intoType.reflectedType} is not HTTPSerializable or List<HTTPSerializable>");
}