]> gitweb @ CieloNegro.org - task-reporter.git/blob - src/main/scala/jp/ymir/taskReporter/core/Task.scala
71526941fd34099dc8785f03afe331ba8f5bdeae
[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 DeadlineChanged extends Status { override def toString() = "期限変更" }
27     case object Completed       extends Status { override def toString() = "完了"     }
28   }
29
30   implicit val CalendarFromField = new FromField[Calendar] {
31     val pattern = """^(\d{4})/(\d{2})/(\d{2})$""".r
32
33     def parseField(f: Field): Parser[Calendar] = f.value match {
34       case pattern(year, month, day) =>
35         new GregorianCalendar(year.toInt, month.toInt - 1, day.toInt).point[Parser]
36       case _ =>
37         ("date not in format yyyy/MM/dd: " + f).raiseError[Calendar]
38     }
39   }
40
41   implicit val StatusFromField = new FromField[Status] {
42     def parseField(f: Field): Parser[Status] = f.value match {
43       case "順調"     => (Status.DoingFine:       Status).point[Parser]
44       case "遅延"     => (Status.Lagging:         Status).point[Parser]
45       case "期限変更" => (Status.DeadlineChanged: 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]  ]('説明).handleError(_ => None.point[Parser])
62       }
63       yield Task(date, ticketID, title, expectedCompletionDate,
64                  deadline, status, description)
65   }
66 }