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() = "完了"}
28 def all: Seq[Status] = Seq(DoingFine, Lagging, Completed)
31 implicit val CalendarFromField = new FromField[Calendar] {
32 val pattern = """^(\d{4})/(\d{2})/(\d{2})$""".r
34 def parseField(f: Field): Parser[Calendar] = f.value match {
35 case pattern(year, month, day) =>
36 new GregorianCalendar(year.toInt, month.toInt - 1, day.toInt).point[Parser]
38 ("date not in format yyyy/MM/dd: " + f).raiseError[Calendar]
42 implicit val StatusFromField = new FromField[Status] {
43 def parseField(f: Field): Parser[Status] = f.value match {
44 case "順調" => (Status.DoingFine: Status).point[Parser]
45 case "遅延" => (Status.Lagging: Status).point[Parser]
46 case "完了" => (Status.Completed: Status).point[Parser]
48 ("invalid status: " + f).raiseError[Status]
52 implicit val TaskFromRecord = new FromRecord[Task] {
53 def parseRecord(r: Record): Parser[Task] =
55 date <- r.lookup[Calendar ]('報告日)
56 ticketID <- r.lookup[Option[Int] ]('チケットID, "")
57 title <- r.lookup[String ]('作業名)
58 expectedCompletionDate <- r.lookup[Calendar ]('作業完了予定年月日)
59 deadline <- r.lookup[Option[Calendar]]('タスク期限, "")
60 status <- r.lookup[Status ]('状態)
61 description <- r.lookup[Option[String] ]('説明, "")
63 yield Task(date, ticketID, title, expectedCompletionDate,
64 deadline, status, description)