MdYamlDocLoader: Use Result

Instead of annoying exceptions.
This commit is contained in:
Vishesh Handa
2021-06-10 03:33:35 +02:00
parent 2cc379231c
commit a3c539bf1f
4 changed files with 23 additions and 21 deletions

View File

@ -1,6 +1,7 @@
import 'dart:io'; import 'dart:io';
import 'dart:isolate'; import 'dart:isolate';
import 'package:dart_git/utils/result.dart';
import 'package:synchronized/synchronized.dart'; import 'package:synchronized/synchronized.dart';
import 'package:gitjournal/core/md_yaml_doc.dart'; import 'package:gitjournal/core/md_yaml_doc.dart';
@ -34,13 +35,13 @@ class MdYamlDocLoader {
}); });
} }
// FIXME: Don't throw exceptions! Future<Result<MdYamlDoc>> loadDoc(String filePath) async {
Future<MdYamlDoc?> loadDoc(String filePath) async {
await _initIsolate(); await _initIsolate();
final file = File(filePath); final file = File(filePath);
if (!file.existsSync()) { if (!file.existsSync()) {
throw MdYamlDocNotFoundException(filePath); var ex = MdYamlDocNotFoundException(filePath);
return Result.fail(ex);
} }
var rec = ReceivePort(); var rec = ReceivePort();
@ -52,10 +53,11 @@ class MdYamlDocLoader {
assert(resp.filePath == filePath); assert(resp.filePath == filePath);
if (resp.doc != null) { if (resp.doc != null) {
return resp.doc; return Result(resp.doc!);
} }
throw MdYamlParsingException(filePath, resp.err.toString()); var ex = MdYamlParsingException(filePath, resp.err.toString());
return Result.fail(ex);
} }
} }

View File

@ -366,21 +366,22 @@ class Note with NotesNotifier {
var isOrg = fpLowerCase.endsWith('.org'); var isOrg = fpLowerCase.endsWith('.org');
if (isMarkdown) { if (isMarkdown) {
try { var dataResult = await _mdYamlDocLoader.loadDoc(_filePath!);
var dataMaybe = await _mdYamlDocLoader.loadDoc(_filePath!); if (dataResult.isSuccess) {
data = dataMaybe!; data = dataResult.getOrThrow();
_fileFormat = NoteFileFormat.Markdown; _fileFormat = NoteFileFormat.Markdown;
} on MdYamlDocNotFoundException catch (_) { } else {
if (dataResult.error is MdYamlDocNotFoundException) {
_loadState = NoteLoadState.NotExists; _loadState = NoteLoadState.NotExists;
_notifyModified(); _notifyModified();
return _loadState; return _loadState;
} on MdYamlParsingException catch (err, stackTrace) { }
logException(err, stackTrace); if (dataResult.error is MdYamlParsingException) {
_loadState = NoteLoadState.Error; _loadState = NoteLoadState.Error;
_notifyModified(); _notifyModified();
return _loadState; return _loadState;
} }
}
} else if (isTxt) { } else if (isTxt) {
try { try {
body = await File(_filePath!).readAsString(); body = await File(_filePath!).readAsString();

View File

@ -1,6 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:collection/collection.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:function_types/function_types.dart'; import 'package:function_types/function_types.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';

View File

@ -1,9 +1,9 @@
import 'dart:io'; import 'dart:io';
import 'package:dart_git/utils/result.dart';
import 'package:path/path.dart' as p; import 'package:path/path.dart' as p;
import 'package:test/test.dart'; import 'package:test/test.dart';
import 'package:gitjournal/core/md_yaml_doc.dart';
import 'package:gitjournal/core/md_yaml_doc_loader.dart'; import 'package:gitjournal/core/md_yaml_doc_loader.dart';
void main() { void main() {
@ -29,7 +29,7 @@ Alright.""";
test('Should load one doc', () async { test('Should load one doc', () async {
var loader = MdYamlDocLoader(); var loader = MdYamlDocLoader();
var doc = (await loader.loadDoc(filePath)) as MdYamlDoc; var doc = await loader.loadDoc(filePath).getOrThrow();
expect(doc.body, "Alright."); expect(doc.body, "Alright.");
expect(doc.props["type"], "Journal"); expect(doc.props["type"], "Journal");