I’m trying to write a Taskpaper parser in Go.
A very basic Taskpaper file looks like this:
Home: - Mow the lawn Don't hit the flowers Work: - Fix all the bugs Seriously, all the bugs
Projects end with a :
and tasks begin with a -
and any line that doesn’t have that is a note. Projects have tasks and notes and tasks can have notes.
I got totally stuck yesterday on how to structure this data in Go.
If this was Ruby I would do it like this:
class Item attr_accessor :parent attr_accessor :notes end class Project < Item attr_accessor :tasks def initialize(desc) super(desc) end end class Task < Item def initialize(desc) super(desc) end end class Note < Item def initialize(desc) super(desc) end end
An Item
holds generic fields and then there’s a Project
, Task
and Note
classes.
In Go there’s no way to say that a Note
struct has just a generic Parent
i.e. Parent *Item
. To work around this I had to create a ProjectNote
and also a TaskNote
:
type Item struct { Desc string } type Project struct { Item Tasks []Task Notes []ProjectNote Tags []ProjectTag } type Task struct { Item Notes []TaskNote Tags []TaskTag Parent *Project } type ProjectNote struct { Item Parent *Project } type TaskNote struct { Item Parent *Task }
It feels a bit wrong to break these out like this but that’s probably because I’ve been stuck in the OO world of Ruby and Java for too long.