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 {
|
||||
String id;
|
||||
final DateTime createdAt;
|
||||
final String body;
|
||||
DateTime createdAt;
|
||||
String body;
|
||||
|
||||
Note({this.createdAt, this.body, this.id});
|
||||
|
||||
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(
|
||||
id: json['id'],
|
||||
id: id,
|
||||
createdAt: DateTime.parse(json['createdAt']),
|
||||
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
|
||||
version: "1.0.7"
|
||||
yaml:
|
||||
dependency: transitive
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: yaml
|
||||
url: "https://pub.dartlang.org"
|
||||
|
@ -9,7 +9,7 @@ dependencies:
|
||||
path: "^1.5.1"
|
||||
path_provider: "^0.4.0"
|
||||
uuid: "^1.0.0"
|
||||
|
||||
yaml: "^2.1.13"
|
||||
|
||||
dev_dependencies:
|
||||
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