mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-07-13 22:53:45 +08:00
Add Note serializers
This way we don't only need to use json.
This commit is contained in:
@ -4,14 +4,24 @@ typedef NoteUpdator(Note note);
|
|||||||
|
|
||||||
class Note implements Comparable {
|
class Note implements Comparable {
|
||||||
String id;
|
String id;
|
||||||
final DateTime createdAt;
|
DateTime createdAt;
|
||||||
final String body;
|
String body;
|
||||||
|
|
||||||
Note({this.createdAt, this.body, this.id});
|
Note({this.createdAt, this.body, this.id});
|
||||||
|
|
||||||
factory Note.fromJson(Map<String, dynamic> json) {
|
factory Note.fromJson(Map<String, dynamic> json) {
|
||||||
|
String id;
|
||||||
|
if (json.containsKey("id")) {
|
||||||
|
var val = json["id"];
|
||||||
|
if (val.runtimeType == String) {
|
||||||
|
id = val;
|
||||||
|
} else {
|
||||||
|
id = val.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return new Note(
|
return new Note(
|
||||||
id: json['id'],
|
id: id,
|
||||||
createdAt: DateTime.parse(json['createdAt']),
|
createdAt: DateTime.parse(json['createdAt']),
|
||||||
body: json['body'],
|
body: json['body'],
|
||||||
);
|
);
|
||||||
|
60
lib/serializers.dart
Normal file
60
lib/serializers.dart
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:yaml/yaml.dart';
|
||||||
|
import 'package:journal/note.dart';
|
||||||
|
|
||||||
|
abstract class NoteSerializer {
|
||||||
|
String encode(Note note);
|
||||||
|
Note decode(String str);
|
||||||
|
}
|
||||||
|
|
||||||
|
class JsonNoteSerializer implements NoteSerializer {
|
||||||
|
@override
|
||||||
|
Note decode(String str) {
|
||||||
|
final json = JsonDecoder().convert(str);
|
||||||
|
return new Note.fromJson(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String encode(Note note) {
|
||||||
|
return JsonEncoder().convert(note.toJson());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class MarkdownYAMLSerializer implements NoteSerializer {
|
||||||
|
@override
|
||||||
|
Note decode(String str) {
|
||||||
|
if (str.startsWith("---\n")) {
|
||||||
|
var parts = str.split("---\n");
|
||||||
|
|
||||||
|
var yamlMap = loadYaml(parts[1]);
|
||||||
|
Map<String, dynamic> map = new Map<String, dynamic>();
|
||||||
|
yamlMap.forEach((key, value) {
|
||||||
|
map[key] = value;
|
||||||
|
});
|
||||||
|
map['body'] = parts[2].trimLeft();
|
||||||
|
|
||||||
|
return new Note.fromJson(map);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Note(body: str);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String encode(Note note) {
|
||||||
|
const serparator = '---\n';
|
||||||
|
var str = "";
|
||||||
|
str += serparator;
|
||||||
|
|
||||||
|
var metadata = note.toJson();
|
||||||
|
metadata.remove('body');
|
||||||
|
metadata.forEach((key, value) {
|
||||||
|
str += key + ": " + value + "\n";
|
||||||
|
});
|
||||||
|
str += serparator;
|
||||||
|
str += '\n';
|
||||||
|
str += note.body;
|
||||||
|
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
}
|
@ -374,7 +374,7 @@ packages:
|
|||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.7"
|
version: "1.0.7"
|
||||||
yaml:
|
yaml:
|
||||||
dependency: transitive
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: yaml
|
name: yaml
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
|
@ -9,7 +9,7 @@ dependencies:
|
|||||||
path: "^1.5.1"
|
path: "^1.5.1"
|
||||||
path_provider: "^0.4.0"
|
path_provider: "^0.4.0"
|
||||||
uuid: "^1.0.0"
|
uuid: "^1.0.0"
|
||||||
|
yaml: "^2.1.13"
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
|
29
test/serializers_test.dart
Normal file
29
test/serializers_test.dart
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:journal/note.dart';
|
||||||
|
import 'package:journal/serializers.dart';
|
||||||
|
|
||||||
|
import 'package:test/test.dart';
|
||||||
|
|
||||||
|
main() {
|
||||||
|
group('Serializers', () {
|
||||||
|
var note =
|
||||||
|
Note(id: "2", body: "This is the body", createdAt: new DateTime.now());
|
||||||
|
|
||||||
|
test('JSON Serializer', () {
|
||||||
|
var jsonSerializer = new JsonNoteSerializer();
|
||||||
|
var str = jsonSerializer.encode(note);
|
||||||
|
var note2 = jsonSerializer.decode(str);
|
||||||
|
|
||||||
|
expect(note2, note);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Markdown Serializer', () {
|
||||||
|
var jsonSerializer = new MarkdownYAMLSerializer();
|
||||||
|
var str = jsonSerializer.encode(note);
|
||||||
|
var note2 = jsonSerializer.decode(str);
|
||||||
|
|
||||||
|
expect(note2, note);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
Reference in New Issue
Block a user