refactor: Replace MayFail by Result
This commit is contained in:
parent
2e3472d88f
commit
300a52f9fe
@ -25,12 +25,12 @@ export 'package:moxxmpp/src/presence.dart';
|
||||
export 'package:moxxmpp/src/reconnect.dart';
|
||||
export 'package:moxxmpp/src/rfcs/rfc_2782.dart';
|
||||
export 'package:moxxmpp/src/rfcs/rfc_4790.dart';
|
||||
export 'package:moxxmpp/src/roster.dart';
|
||||
export 'package:moxxmpp/src/roster/errors.dart';
|
||||
export 'package:moxxmpp/src/roster/roster.dart';
|
||||
export 'package:moxxmpp/src/settings.dart';
|
||||
export 'package:moxxmpp/src/socket.dart';
|
||||
export 'package:moxxmpp/src/stanza.dart';
|
||||
export 'package:moxxmpp/src/stringxml.dart';
|
||||
export 'package:moxxmpp/src/types/error.dart';
|
||||
export 'package:moxxmpp/src/types/result.dart';
|
||||
export 'package:moxxmpp/src/xeps/staging/extensible_file_thumbnails.dart';
|
||||
export 'package:moxxmpp/src/xeps/staging/file_upload_notification.dart';
|
||||
@ -61,7 +61,8 @@ export 'package:moxxmpp/src/xeps/xep_0333.dart';
|
||||
export 'package:moxxmpp/src/xeps/xep_0334.dart';
|
||||
export 'package:moxxmpp/src/xeps/xep_0352.dart';
|
||||
export 'package:moxxmpp/src/xeps/xep_0359.dart';
|
||||
export 'package:moxxmpp/src/xeps/xep_0363.dart';
|
||||
export 'package:moxxmpp/src/xeps/xep_0363/errors.dart';
|
||||
export 'package:moxxmpp/src/xeps/xep_0363/xep_0363.dart';
|
||||
export 'package:moxxmpp/src/xeps/xep_0380.dart';
|
||||
export 'package:moxxmpp/src/xeps/xep_0384/crypto.dart';
|
||||
export 'package:moxxmpp/src/xeps/xep_0384/errors.dart';
|
||||
|
@ -15,7 +15,7 @@ import 'package:moxxmpp/src/negotiators/namespaces.dart';
|
||||
import 'package:moxxmpp/src/negotiators/negotiator.dart';
|
||||
import 'package:moxxmpp/src/presence.dart';
|
||||
import 'package:moxxmpp/src/reconnect.dart';
|
||||
import 'package:moxxmpp/src/roster.dart';
|
||||
import 'package:moxxmpp/src/roster/roster.dart';
|
||||
import 'package:moxxmpp/src/routing.dart';
|
||||
import 'package:moxxmpp/src/settings.dart';
|
||||
import 'package:moxxmpp/src/socket.dart';
|
||||
|
7
packages/moxxmpp/lib/src/roster/errors.dart
Normal file
7
packages/moxxmpp/lib/src/roster/errors.dart
Normal file
@ -0,0 +1,7 @@
|
||||
abstract class RosterError {}
|
||||
|
||||
/// Returned when the server's response did not contain a <query /> element
|
||||
class NoQueryError extends RosterError {}
|
||||
|
||||
/// Unspecified error
|
||||
class UnknownError extends RosterError {}
|
@ -7,16 +7,12 @@ import 'package:moxxmpp/src/managers/namespaces.dart';
|
||||
import 'package:moxxmpp/src/namespaces.dart';
|
||||
import 'package:moxxmpp/src/negotiators/namespaces.dart';
|
||||
import 'package:moxxmpp/src/negotiators/negotiator.dart';
|
||||
import 'package:moxxmpp/src/roster/errors.dart';
|
||||
import 'package:moxxmpp/src/stanza.dart';
|
||||
import 'package:moxxmpp/src/stringxml.dart';
|
||||
import 'package:moxxmpp/src/types/error.dart';
|
||||
import 'package:moxxmpp/src/types/result.dart';
|
||||
|
||||
const rosterErrorNoQuery = 1;
|
||||
const rosterErrorNonResult = 2;
|
||||
|
||||
class XmppRosterItem {
|
||||
|
||||
XmppRosterItem({ required this.jid, required this.subscription, this.ask, this.name, this.groups = const [] });
|
||||
final String jid;
|
||||
final String? name;
|
||||
@ -32,14 +28,12 @@ enum RosterRemovalResult {
|
||||
}
|
||||
|
||||
class RosterRequestResult {
|
||||
|
||||
RosterRequestResult({ required this.items, this.ver });
|
||||
List<XmppRosterItem> items;
|
||||
String? ver;
|
||||
}
|
||||
|
||||
class RosterPushEvent extends XmppEvent {
|
||||
|
||||
RosterPushEvent({ required this.item, this.ver });
|
||||
final XmppRosterItem item;
|
||||
final String? ver;
|
||||
@ -149,7 +143,7 @@ class RosterManager extends XmppManagerBase {
|
||||
|
||||
/// Shared code between requesting rosters without and with roster versioning, if
|
||||
/// the server deems a regular roster response more efficient than n roster pushes.
|
||||
Future<MayFail<RosterRequestResult>> _handleRosterResponse(XMLNode? query) async {
|
||||
Future<Result<RosterRequestResult, RosterError>> _handleRosterResponse(XMLNode? query) async {
|
||||
final List<XmppRosterItem> items;
|
||||
if (query != null) {
|
||||
items = query.children.map((item) => XmppRosterItem(
|
||||
@ -167,7 +161,7 @@ class RosterManager extends XmppManagerBase {
|
||||
}
|
||||
} else {
|
||||
logger.warning('Server response to roster request without roster versioning does not contain a <query /> element, while the type is not error. This violates RFC6121');
|
||||
return MayFail.failure(rosterErrorNoQuery);
|
||||
return Result(NoQueryError());
|
||||
}
|
||||
|
||||
final ver = query.attributes['ver'] as String?;
|
||||
@ -176,7 +170,7 @@ class RosterManager extends XmppManagerBase {
|
||||
await commitLastRosterVersion(ver);
|
||||
}
|
||||
|
||||
return MayFail.success(
|
||||
return Result(
|
||||
RosterRequestResult(
|
||||
items: items,
|
||||
ver: ver,
|
||||
@ -186,7 +180,7 @@ class RosterManager extends XmppManagerBase {
|
||||
}
|
||||
|
||||
/// Requests the roster following RFC 6121 without using roster versioning.
|
||||
Future<MayFail<RosterRequestResult>> requestRoster() async {
|
||||
Future<Result<RosterRequestResult, RosterError>> requestRoster() async {
|
||||
final attrs = getAttributes();
|
||||
final response = await attrs.sendStanza(
|
||||
Stanza.iq(
|
||||
@ -202,7 +196,7 @@ class RosterManager extends XmppManagerBase {
|
||||
|
||||
if (response.attributes['type'] != 'result') {
|
||||
logger.warning('Error requesting roster without roster versioning: ${response.toXml()}');
|
||||
return MayFail.failure(rosterErrorNonResult);
|
||||
return Result(UnknownError());
|
||||
}
|
||||
|
||||
final query = response.firstTag('query', xmlns: rosterXmlns);
|
||||
@ -211,7 +205,7 @@ class RosterManager extends XmppManagerBase {
|
||||
|
||||
/// Requests a series of roster pushes according to RFC6121. Requires that the server
|
||||
/// advertises urn:xmpp:features:rosterver in the stream features.
|
||||
Future<MayFail<RosterRequestResult?>> requestRosterPushes() async {
|
||||
Future<Result<RosterRequestResult?, RosterError>> requestRosterPushes() async {
|
||||
if (_rosterVersion == null) {
|
||||
await loadLastRosterVersion();
|
||||
}
|
||||
@ -234,7 +228,7 @@ class RosterManager extends XmppManagerBase {
|
||||
|
||||
if (result.attributes['type'] != 'result') {
|
||||
logger.warning('Requesting roster pushes failed: ${result.toXml()}');
|
||||
return MayFail.failure(rosterErrorNonResult);
|
||||
return Result(UnknownError());
|
||||
}
|
||||
|
||||
final query = result.firstTag('query', xmlns: rosterXmlns);
|
@ -1,19 +0,0 @@
|
||||
/// A wrapper class that can be used to indicate that a function may return a valid
|
||||
/// instance of [T] but may also fail.
|
||||
/// The way [MayFail] is intended to be used to to have function specific - or application
|
||||
/// specific - error codes that can be either handled by code or be translated into a
|
||||
/// localised error message for the user.
|
||||
class MayFail<T> {
|
||||
|
||||
MayFail({ this.result, this.errorCode });
|
||||
MayFail.success(this.result);
|
||||
MayFail.failure(this.errorCode);
|
||||
T? result;
|
||||
int? errorCode;
|
||||
|
||||
bool isError() => result == null && errorCode != null;
|
||||
|
||||
T getValue() => result!;
|
||||
|
||||
int getErrorCode() => errorCode!;
|
||||
}
|
10
packages/moxxmpp/lib/src/xeps/xep_0363/errors.dart
Normal file
10
packages/moxxmpp/lib/src/xeps/xep_0363/errors.dart
Normal file
@ -0,0 +1,10 @@
|
||||
abstract class HttpFileUploadError {}
|
||||
|
||||
/// Returned when we don't know what JID to ask for an upload slot
|
||||
class NoEntityKnownError extends HttpFileUploadError {}
|
||||
|
||||
/// Returned when the file we want to upload is too big
|
||||
class FileTooBigError extends HttpFileUploadError {}
|
||||
|
||||
/// Unspecified errors
|
||||
class UnknownHttpFileUploadError extends HttpFileUploadError {}
|
@ -7,19 +7,15 @@ import 'package:moxxmpp/src/managers/namespaces.dart';
|
||||
import 'package:moxxmpp/src/namespaces.dart';
|
||||
import 'package:moxxmpp/src/stanza.dart';
|
||||
import 'package:moxxmpp/src/stringxml.dart';
|
||||
import 'package:moxxmpp/src/types/error.dart';
|
||||
import 'package:moxxmpp/src/types/result.dart';
|
||||
import 'package:moxxmpp/src/xeps/xep_0030/errors.dart';
|
||||
import 'package:moxxmpp/src/xeps/xep_0030/types.dart';
|
||||
import 'package:moxxmpp/src/xeps/xep_0030/xep_0030.dart';
|
||||
|
||||
const errorNoUploadServer = 1;
|
||||
const errorFileTooBig = 2;
|
||||
const errorGeneric = 3;
|
||||
import 'package:moxxmpp/src/xeps/xep_0363/errors.dart';
|
||||
|
||||
const allowedHTTPHeaders = [ 'authorization', 'cookie', 'expires' ];
|
||||
|
||||
class HttpFileUploadSlot {
|
||||
|
||||
const HttpFileUploadSlot(this.putUrl, this.getUrl, this.headers);
|
||||
final String putUrl;
|
||||
final String getUrl;
|
||||
@ -45,7 +41,6 @@ Map<String, String> prepareHeaders(Map<String, String> headers) {
|
||||
}
|
||||
|
||||
class HttpFileUploadManager extends XmppManagerBase {
|
||||
|
||||
HttpFileUploadManager() : _gotSupported = false, _supported = false, super();
|
||||
JID? _entityJid;
|
||||
int? _maxUploadSize;
|
||||
@ -119,17 +114,17 @@ class HttpFileUploadManager extends XmppManagerBase {
|
||||
/// the file's size in octets. [contentType] is optional and refers to the file's
|
||||
/// Mime type.
|
||||
/// Returns an [HttpFileUploadSlot] if the request was successful; null otherwise.
|
||||
Future<MayFail<HttpFileUploadSlot>> requestUploadSlot(String filename, int filesize, { String? contentType }) async {
|
||||
if (!(await isSupported())) return MayFail.failure(errorNoUploadServer);
|
||||
Future<Result<HttpFileUploadSlot, HttpFileUploadError>> requestUploadSlot(String filename, int filesize, { String? contentType }) async {
|
||||
if (!(await isSupported())) return Result(NoEntityKnownError());
|
||||
|
||||
if (_entityJid == null) {
|
||||
logger.warning('Attempted to request HTTP File Upload slot but no entity is known to send this request to.');
|
||||
return MayFail.failure(errorNoUploadServer);
|
||||
return Result(NoEntityKnownError());
|
||||
}
|
||||
|
||||
if (_maxUploadSize != null && filesize > _maxUploadSize!) {
|
||||
logger.warning('Attempted to request HTTP File Upload slot for a file that exceeds the filesize limit');
|
||||
return MayFail.failure(errorFileTooBig);
|
||||
return Result(FileTooBigError());
|
||||
}
|
||||
|
||||
final attrs = getAttributes();
|
||||
@ -154,7 +149,7 @@ class HttpFileUploadManager extends XmppManagerBase {
|
||||
if (response.attributes['type']! != 'result') {
|
||||
logger.severe('Failed to request HTTP File Upload slot.');
|
||||
// TODO(Unknown): Be more precise
|
||||
return MayFail.failure(errorGeneric);
|
||||
return Result(UnknownHttpFileUploadError());
|
||||
}
|
||||
|
||||
final slot = response.firstTag('slot', xmlns: httpFileUploadXmlns)!;
|
||||
@ -169,7 +164,7 @@ class HttpFileUploadManager extends XmppManagerBase {
|
||||
}),
|
||||
);
|
||||
|
||||
return MayFail.success(
|
||||
return Result(
|
||||
HttpFileUploadSlot(
|
||||
putUrl,
|
||||
getUrl,
|
@ -44,7 +44,6 @@ const _doNotEncryptList = [
|
||||
];
|
||||
|
||||
abstract class OmemoManager extends XmppManagerBase {
|
||||
|
||||
OmemoManager() : _handlerLock = Lock(), _handlerFutures = {}, super();
|
||||
|
||||
final Lock _handlerLock;
|
||||
|
Loading…
Reference in New Issue
Block a user