1 package jp.ymir.taskReporter.core
2 import scala.collection._
3 import scala.collection.immutable.StringLike
6 type Header = Seq[Symbol]
8 type Record = Map[Symbol, Field]
10 def decode[A: FromRecord](tsv: StringLike[_]): Seq[A] = {
11 val lines = tsv.split('\n').filter(!_.isEmpty)
12 val header = lines.head.split('\t').map(Symbol(_))
13 val body = lines.tail.map(line => (header zip line.split('\t')).toMap)
14 return body.map(implicitly[FromRecord[A]].parseRecord)
18 def parseRecord(r: Record): A
22 def parseField(f: Field): A
24 def parseField[A: FromField](f: Field): A
25 = implicitly[FromField[A]].parseField(f)
28 def toRecord(a: A): Record
32 def toField(a: A): Field
36 implicit def OptionFromField[A: FromField] = new FromField[Option[A]] {
37 def parseField(f: Field): Option[A] = {
42 return Some(implicitly[FromField[A]].parseField(f))
48 implicit def StringFromField = new FromField[String] {
49 def parseField(f: Field): String = f
53 implicit def IntFromField = new FromField[Int] {
54 def parseField(f: Field): Int = f.toInt