import 'dart:convert'; import 'package:http/http.dart' as http; import '../errors/network_exception.dart'; import '../errors/parse_exception.dart'; import '../errors/server_exception.dart'; import '../http_errors.dart'; abstract class MhslApi { String subpath; MhslApi(this.subpath); Future? request(Uri uri); T assemble(String raw); Future run() async { final endpoint = Uri.parse( 'https://mhsl.eu/marianum/marianummobile/$subpath', ); final data = await sendGuarded('mhsl $subpath', () => request(endpoint)); if (data == null) { throw const NetworkException( userMessage: 'Keine Antwort vom MHSL-Dienst erhalten.', technicalDetails: 'mhsl request returned null', ); } if (data.statusCode > 299) { throw ServerException( statusCode: data.statusCode, technicalDetails: 'mhsl $subpath HTTP ${data.statusCode}', ); } try { return assemble(utf8.decode(data.bodyBytes)); } catch (e) { throw ParseException(technicalDetails: 'mhsl $subpath assemble: $e'); } } }