import 'dart:convert'; class AliceParser { static const String _emptyBody = "Body is empty"; static const String _unknownContentType = "Unknown"; static const String _jsonContentTypeSmall = "content-type"; static const String _jsonContentTypeBig = "Content-Type"; static const String _stream = "Stream"; static const String _applicationJson = "application/json"; static const String _parseFailedText = "Failed to parse "; static const JsonEncoder encoder = JsonEncoder.withIndent(' '); static String _parseJson(dynamic json) { try { return encoder.convert(json); } catch (exception) { return json.toString(); } } static dynamic _decodeJson(dynamic body) { try { return json.decode(body as String); } catch (exception) { return body; } } static String formatBody(dynamic body, String? contentType) { try { if (body == null) { return _emptyBody; } var bodyContent = _emptyBody; if (contentType == null || !contentType.toLowerCase().contains(_applicationJson)) { final bodyTemp = body.toString(); if (bodyTemp.isNotEmpty) { bodyContent = bodyTemp; } } else { if (body is String && body.contains("\n")) { bodyContent = body; } else { if (body is String) { if (body.isNotEmpty) { //body is minified json, so decode it to a map and let the encoder pretty print this map bodyContent = _parseJson(_decodeJson(body)); } } else if (body is Stream) { bodyContent = _stream; } else { bodyContent = _parseJson(body); } } } return bodyContent; } catch (exception) { return _parseFailedText + body.toString(); } } static String? getContentType(Map? headers) { if (headers != null) { if (headers.containsKey(_jsonContentTypeSmall)) { return headers[_jsonContentTypeSmall] as String?; } if (headers.containsKey(_jsonContentTypeBig)) { return headers[_jsonContentTypeBig] as String?; } } return _unknownContentType; } }