class Embeddable { final String type; final dynamic data; Embeddable(this.type, this.data) : assert(type != null), assert(data != null); Map<String, dynamic> toJson() { Map<String, String> m = {type: data}; return m; } static Embeddable fromJson(Map<String, dynamic> json) { Map<String, dynamic> m = Map<String, dynamic>.from(json); assert(m.length == 1, 'Embeddable map has one key'); return BlockEmbed(m.keys.first, m.values.first); } } class BlockEmbed extends Embeddable { BlockEmbed(String type, String data) : super(type, data); static final BlockEmbed horizontalRule = BlockEmbed('divider', 'hr'); static BlockEmbed image(String imageUrl) => BlockEmbed('image', imageUrl); }