Add Note serializers

This way we don't only need to use json.
This commit is contained in:
Vishesh Handa
2018-06-01 18:57:53 +02:00
parent 451ef6e39f
commit fdf8c06c24
5 changed files with 104 additions and 5 deletions

View File

@ -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
View 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;
}
}

View File

@ -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"

View File

@ -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:

View 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);
});
});
}