]> gitweb @ CieloNegro.org - task-reporter.git/blob - src/main/scala/jp/ymir/taskReporter/core/Task.scala
wip
[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     def all: Seq[Status] = Seq(DoingFine, Lagging, Completed)
29   }
30
31   implicit val CalendarFromField = new FromField[Calendar] {
32     val pattern = """^(\d{4})/(\d{2})/(\d{2})$""".r
33
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]
37       case _ =>
38         ("date not in format yyyy/MM/dd: " + f).raiseError[Calendar]
39     }
40   }
41
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]
47       case _ =>
48         ("invalid status: " + f).raiseError[Status]
49     }
50   }
51
52   implicit val TaskFromRecord = new FromRecord[Task] {
53     def parseRecord(r: Record): Parser[Task] =
54       for {
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]  ]('説明, "")
62       }
63       yield Task(date, ticketID, title, expectedCompletionDate,
64                  deadline, status, description)
65   }
66 }