]> gitweb @ CieloNegro.org - task-reporter.git/blob - src/main/scala/jp/ymir/taskReporter/core/Task.scala
adopt the new format
[task-reporter.git] / src / main / scala / jp / ymir / taskReporter / core / Task.scala
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
6 import scalaz._
7 import Scalaz._
8
9 case class Task(
10   date:                   Calendar,
11   ticketID:               Option[Int],
12   title:                  String,
13   expectedCompletionDate: Calendar,
14   deadline:               Option[Calendar],
15   status:                 Task.Status,
16   description:            Option[String]
17 )
18
19 object Task {
20   import TSV._
21
22   sealed abstract class Status
23   object 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() = "完了"}
27   }
28
29   implicit val CalendarFromField = new FromField[Calendar] {
30     val pattern = """^(\d{4})/(\d{2})/(\d{2})$""".r
31
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]
35       case _ =>
36         ("date not in format yyyy/MM/dd: " + f).raiseError[Calendar]
37     }
38   }
39
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]
45       case _ =>
46         ("invalid status: " + f).raiseError[Status]
47     }
48   }
49
50   implicit val TaskFromRecord = new FromRecord[Task] {
51     def parseRecord(r: Record): Parser[Task] =
52       for {
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]  ]('説明, "")
60       }
61       yield Task(date, ticketID, title, expectedCompletionDate,
62                  deadline, status, description)
63   }
64 }