1 package jp.ymir.taskReporter.core
2 import java.util.Calendar
3 import java.util.GregorianCalendar
4 import scala.language.reflectiveCalls
5 import scala.util.matching.Regex
11 ticketID: Option[Int],
13 expectedCompletionDate: Calendar,
14 deadline: Option[Calendar],
16 description: Option[String]
22 sealed abstract class Status
24 case object DoingFine extends Status { override def toString() = "順調"}
25 case object Lagging extends Status { override def toString() = "遅延"}
26 case object Completed extends Status { override def toString() = "完了"}
29 implicit val CalendarFromField = new FromField[Calendar] {
30 val pattern = """^(\d{4})/(\d{2})/(\d{2})$""".r
32 def parseField(f: Field): Parser[Calendar] = f.value match {
33 case pattern(year, month, day) =>
34 new GregorianCalendar(year.toInt, month.toInt - 1, day.toInt).point[Parser]
36 ("date not in format yyyy/MM/dd: " + f).raiseError[Calendar]
40 implicit val StatusFromField = new FromField[Status] {
41 def parseField(f: Field): Parser[Status] = f.value match {
42 case "順調" => (Status.DoingFine: Status).point[Parser]
43 case "遅延" => (Status.Lagging: Status).point[Parser]
44 case "完了" => (Status.Completed: Status).point[Parser]
46 ("invalid status: " + f).raiseError[Status]
50 implicit val TaskFromRecord = new FromRecord[Task] {
51 def parseRecord(r: Record): Parser[Task] =
53 date <- r.lookup[Calendar ]('報告日)
54 ticketID <- r.lookup[Option[Int] ]('チケットID, "")
55 title <- r.lookup[String ]('作業名)
56 expectedCompletionDate <- r.lookup[Calendar ]('作業完了予定年月日)
57 deadline <- r.lookup[Option[Calendar]]('タスク期限, "")
58 status <- r.lookup[Status ]('状態)
59 description <- r.lookup[Option[String] ]('説明, "")
61 yield Task(date, ticketID, title, expectedCompletionDate,
62 deadline, status, description)