import 'dart:io'; import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; import 'package:paperless_api/src/extensions/dio_exception_extension.dart'; import 'package:paperless_api/src/models/paperless_api_exception.dart'; Future getSingleResult( String url, T Function(Map) fromJson, ErrorCode errorCode, { required Dio client, int minRequiredApiVersion = 1, }) async { try { final response = await client.get( url, options: Options( headers: {'accept': 'application/json; version=$minRequiredApiVersion'}, validateStatus: (status) => status == 200, ), ); return compute( fromJson, response.data as Map, ); } on DioException catch (exception) { throw exception.unravel(orElse: PaperlessApiException(errorCode)); } } Future> getCollection( String url, T Function(Map) fromJson, ErrorCode errorCode, { required Dio client, int minRequiredApiVersion = 1, }) async { try { final response = await client.get( url, options: Options( headers: {'accept': 'application/json; version=$minRequiredApiVersion'}, validateStatus: (status) => status == 200, ), ); final Map body = response.data; if (body['count'] == 0) { return []; } else { return compute( _collectionFromJson, _CollectionFromJsonSerializationParams( fromJson, (body['results'] as List).cast>(), ), ); } } on DioException catch (exception) { throw exception.unravel(orElse: PaperlessApiException(errorCode)); } } List _collectionFromJson( _CollectionFromJsonSerializationParams params, ) { return params.list.map((result) => params.fromJson(result)).toList(); } class _CollectionFromJsonSerializationParams { final T Function(Map) fromJson; final List> list; _CollectionFromJsonSerializationParams(this.fromJson, this.list); } int getExtendedVersionNumber(String version) { List versionCells = version.split('.'); versionCells = versionCells.map((i) => int.parse(i)).toList(); return versionCells[0] * 100000 + versionCells[1] * 1000 + versionCells[2]; } int? tryParseNullable(String? source, {int? radix}) { if (source == null) return null; return int.tryParse(source, radix: radix); }