Skip to content

Commit c8b5448

Browse files
authored
Merge pull request #565 from hmrc/DSLN-260
DLSN-260: Migrate Scala 2 Custom Enumerable to Scala 3 Enums
2 parents e1f0d00 + e9a89b1 commit c8b5448

File tree

43 files changed

+360
-428
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+360
-428
lines changed

app/models/CommonModels.scala

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -24,43 +24,52 @@ import uk.gov.hmrc.govukfrontend.views.viewmodels.radios.RadioItem
2424

2525
import java.time.LocalDate
2626

27-
sealed trait SelectTitle
2827

29-
object SelectTitle extends Enumerable.Implicits {
28+
enum SelectTitle(val code: String) {
29+
case Mr extends SelectTitle("0001")
30+
case Mrs extends SelectTitle("0002")
31+
private case Miss extends SelectTitle("0003")
32+
case Ms extends SelectTitle("0004")
33+
case UnsupportedTitle extends SelectTitle("unsupported")
3034

31-
case object Mr extends WithName("0001") with SelectTitle
32-
case object Mrs extends WithName("0002") with SelectTitle
33-
private case object Miss extends WithName("0003") with SelectTitle
34-
case object Ms extends WithName("0004") with SelectTitle
35-
case object UnsupportedTitle extends WithName("unsupported") with SelectTitle
36-
37-
val values: Seq[SelectTitle] = Seq(
38-
Mr,
39-
Mrs,
40-
Miss,
41-
Ms
42-
)
35+
override def toString: String = code
36+
}
4337

44-
private val valuesAndUnsupported: Seq[SelectTitle] = values :+ UnsupportedTitle
38+
object SelectTitle extends Enumerable.Implicits {
39+
40+
val supportedValues: Seq[SelectTitle] =
41+
SelectTitle.values.toSeq.filterNot(_ == UnsupportedTitle)
4542

46-
def options(form: Form[?])(implicit messages: Messages): Seq[RadioItem] = values.map { value =>
43+
def options(form: Form[?])(implicit messages: Messages): Seq[RadioItem] = supportedValues.map { value =>
4744
RadioItem(
48-
value = Some(value.toString),
49-
content = Text(messages(s"nameTitle.${value.toString}")),
50-
checked = form("value").value.contains(value.toString)
45+
value = Some(value.code),
46+
content = Text(messages(s"nameTitle.${value.code}")),
47+
checked = form("value").value.contains(value.code)
5148
)
5249
}
5350

5451
implicit val enumerable: Enumerable[SelectTitle] =
55-
Enumerable(valuesAndUnsupported.map(v => v.toString -> v)*)
52+
Enumerable(values.map(v => v.code -> v)*)
53+
54+
implicit val format: Format[SelectTitle] = Format(
55+
Reads {
56+
case JsString(s) =>
57+
SelectTitle.values.find(_.code == s)
58+
.orElse(SelectTitle.values.find(_.toString == s))
59+
.map(JsSuccess(_))
60+
.getOrElse(JsError("error.invalid"))
61+
case _ => JsError("error.invalid")
62+
},
63+
Writes(t => JsString(t.code))
64+
)
5665
}
5766

5867
case class Name(title: SelectTitle, firstName: String, middleName: Option[String], lastName: String) {
5968

6069
def getFullName: String = Seq(Some(firstName), middleName, Some(lastName)).flatten.mkString(" ")
6170

6271
def getFullNameWithTitle(implicit messages: Messages): String =
63-
messages(s"nameTitle.${title.toString}") + s" $getFullName"
72+
messages(s"nameTitle.${title.code}") + s" $getFullName"
6473

6574
}
6675

app/models/Mode.scala

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,26 @@ package models
1919
import play.api.libs.json.{JsString, Writes}
2020
import play.api.mvc.JavascriptLiteral
2121

22-
sealed trait Mode
2322

24-
case object CheckMode extends Mode
25-
case object NormalMode extends Mode
26-
case object PlaybackMode extends Mode
23+
enum Mode {
24+
case NormalMode
25+
case CheckMode
26+
case PlaybackMode
27+
}
2728

2829
object Mode {
2930

30-
implicit val jsLiteral: JavascriptLiteral[Mode] = {
31-
case NormalMode => "\"NormalMode\""
32-
case CheckMode => "\"CheckMode\""
33-
case PlaybackMode => "\"PlaybackMode\""
34-
}
31+
given jsLiteral: JavascriptLiteral[Mode] with
32+
override def to(mode: Mode): String = mode match {
33+
case Mode.NormalMode => "\"NormalMode\""
34+
case Mode.CheckMode => "\"CheckMode\""
35+
case Mode.PlaybackMode => "\"PlaybackMode\""
36+
}
3537

36-
implicit val writes: Writes[Mode] = Writes {
37-
case NormalMode => JsString("NormalMode")
38-
case CheckMode => JsString("CheckMode")
39-
case PlaybackMode => JsString("PlaybackMode")
40-
}
38+
given Writes[Mode] with
39+
def writes(mode: Mode): JsString = mode match {
40+
case Mode.NormalMode => JsString("NormalMode")
41+
case Mode.CheckMode => JsString("CheckMode")
42+
case Mode.PlaybackMode => JsString("PlaybackMode")
43+
}
4144
}

app/models/authOfficials/OfficialsPosition.scala

Lines changed: 53 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -16,68 +16,45 @@
1616

1717
package models.authOfficials
1818

19-
import models.{Enumerable, WithName}
19+
import models.Enumerable
2020
import play.api.data.Form
2121
import play.api.i18n.Messages
2222
import uk.gov.hmrc.govukfrontend.views.viewmodels.content.Text
2323
import uk.gov.hmrc.govukfrontend.views.viewmodels.radios.RadioItem
2424
import play.api.libs.json._
2525

26-
sealed trait OfficialsPosition
26+
enum OfficialsPosition(val code: String) {
27+
override def toString: String = code
2728

28-
object OfficialsPosition extends Enumerable.Implicits {
29-
30-
case object BoardMember extends WithName("01") with OfficialsPosition
31-
case object Bursar extends WithName("02") with OfficialsPosition
32-
private case object Chairman extends WithName("03") with OfficialsPosition
33-
private case object ChiefExecutive extends WithName("04") with OfficialsPosition
34-
case object Director extends WithName("05") with OfficialsPosition
35-
private case object Employee extends WithName("06") with OfficialsPosition
36-
private case object FinanceManager extends WithName("07") with OfficialsPosition
37-
private case object FinancialAccountant extends WithName("08") with OfficialsPosition
38-
private case object GiftAidSecretary extends WithName("09") with OfficialsPosition
39-
private case object Governor extends WithName("10") with OfficialsPosition
40-
private case object HeadTeacher extends WithName("11") with OfficialsPosition
41-
private case object AssistantHeadTeacher extends WithName("12") with OfficialsPosition
42-
private case object HumanResourcesManager extends WithName("13") with OfficialsPosition
43-
private case object InformationOfficer extends WithName("14") with OfficialsPosition
44-
private case object MinisterOfReligion extends WithName("15") with OfficialsPosition
45-
private case object Principal extends WithName("16") with OfficialsPosition
46-
private case object Secretary extends WithName("17") with OfficialsPosition
47-
private case object AssistantSecretary extends WithName("18") with OfficialsPosition
48-
private case object Teacher extends WithName("19") with OfficialsPosition
49-
private case object Treasurer extends WithName("20") with OfficialsPosition
50-
private case object AssistantTreasurer extends WithName("21") with OfficialsPosition
51-
private case object Trustee extends WithName("22") with OfficialsPosition
52-
case object UKAgent extends WithName("23") with OfficialsPosition
29+
case BoardMember extends OfficialsPosition("01")
30+
case Bursar extends OfficialsPosition("02")
31+
private case Chairman extends OfficialsPosition("03")
32+
private case ChiefExecutive extends OfficialsPosition("04")
33+
case Director extends OfficialsPosition("05")
34+
private case Employee extends OfficialsPosition("06")
35+
private case FinanceManager extends OfficialsPosition("07")
36+
private case FinancialAccountant extends OfficialsPosition("08")
37+
private case GiftAidSecretary extends OfficialsPosition("09")
38+
private case Governor extends OfficialsPosition("10")
39+
private case HeadTeacher extends OfficialsPosition("11")
40+
private case AssistantHeadTeacher extends OfficialsPosition("12")
41+
private case HumanResourcesManager extends OfficialsPosition("13")
42+
private case InformationOfficer extends OfficialsPosition("14")
43+
private case MinisterOfReligion extends OfficialsPosition("15")
44+
private case Principal extends OfficialsPosition("16")
45+
private case Secretary extends OfficialsPosition("17")
46+
private case AssistantSecretary extends OfficialsPosition("18")
47+
private case Teacher extends OfficialsPosition("19")
48+
private case Treasurer extends OfficialsPosition("20")
49+
private case AssistantTreasurer extends OfficialsPosition("21")
50+
private case Trustee extends OfficialsPosition("22")
51+
case UKAgent extends OfficialsPosition("23")
52+
}
5353

54-
val values: Seq[OfficialsPosition] = Seq(
55-
BoardMember,
56-
Bursar,
57-
Chairman,
58-
ChiefExecutive,
59-
Director,
60-
Employee,
61-
FinanceManager,
62-
FinancialAccountant,
63-
GiftAidSecretary,
64-
Governor,
65-
HeadTeacher,
66-
AssistantHeadTeacher,
67-
HumanResourcesManager,
68-
InformationOfficer,
69-
MinisterOfReligion,
70-
Principal,
71-
Secretary,
72-
AssistantSecretary,
73-
Teacher,
74-
Treasurer,
75-
AssistantTreasurer,
76-
Trustee,
77-
UKAgent
78-
)
7954

80-
def options(form: Form[?])(implicit messages: Messages): Seq[RadioItem] = values.map { value =>
55+
object OfficialsPosition extends Enumerable.Implicits {
56+
57+
def options(form: Form[?])(implicit messages: Messages): Seq[RadioItem] = values.toIndexedSeq.map { value =>
8158
RadioItem(
8259
value = Some(value.toString),
8360
content = Text(messages(s"officialsPosition.${value.toString}")),
@@ -89,29 +66,29 @@ object OfficialsPosition extends Enumerable.Implicits {
8966
Enumerable(values.map(v => v.toString -> v)*)
9067

9168
implicit def reads: Reads[OfficialsPosition] = Reads[OfficialsPosition] {
92-
case JsString(BoardMember.toString) => JsSuccess(BoardMember)
93-
case JsString(Bursar.toString) => JsSuccess(Bursar)
94-
case JsString(Chairman.toString) => JsSuccess(Chairman)
95-
case JsString(ChiefExecutive.toString) => JsSuccess(ChiefExecutive)
96-
case JsString(Director.toString) => JsSuccess(Director)
97-
case JsString(Employee.toString) => JsSuccess(Employee)
98-
case JsString(FinanceManager.toString) => JsSuccess(FinanceManager)
99-
case JsString(FinancialAccountant.toString) => JsSuccess(FinancialAccountant)
100-
case JsString(GiftAidSecretary.toString) => JsSuccess(GiftAidSecretary)
101-
case JsString(Governor.toString) => JsSuccess(Governor)
102-
case JsString(HeadTeacher.toString) => JsSuccess(HeadTeacher)
103-
case JsString(AssistantHeadTeacher.toString) => JsSuccess(AssistantHeadTeacher)
104-
case JsString(HumanResourcesManager.toString) => JsSuccess(HumanResourcesManager)
105-
case JsString(InformationOfficer.toString) => JsSuccess(InformationOfficer)
106-
case JsString(MinisterOfReligion.toString) => JsSuccess(MinisterOfReligion)
107-
case JsString(Principal.toString) => JsSuccess(Principal)
108-
case JsString(Secretary.toString) => JsSuccess(Secretary)
109-
case JsString(AssistantSecretary.toString) => JsSuccess(AssistantSecretary)
110-
case JsString(Teacher.toString) => JsSuccess(Teacher)
111-
case JsString(Treasurer.toString) => JsSuccess(Treasurer)
112-
case JsString(AssistantTreasurer.toString) => JsSuccess(AssistantTreasurer)
113-
case JsString(Trustee.toString) => JsSuccess(Trustee)
114-
case JsString(UKAgent.toString) => JsSuccess(UKAgent)
69+
case JsString(BoardMember.code) => JsSuccess(BoardMember)
70+
case JsString(Bursar.code) => JsSuccess(Bursar)
71+
case JsString(Chairman.code) => JsSuccess(Chairman)
72+
case JsString(ChiefExecutive.code) => JsSuccess(ChiefExecutive)
73+
case JsString(Director.code) => JsSuccess(Director)
74+
case JsString(Employee.code) => JsSuccess(Employee)
75+
case JsString(FinanceManager.code) => JsSuccess(FinanceManager)
76+
case JsString(FinancialAccountant.code) => JsSuccess(FinancialAccountant)
77+
case JsString(GiftAidSecretary.code) => JsSuccess(GiftAidSecretary)
78+
case JsString(Governor.code) => JsSuccess(Governor)
79+
case JsString(HeadTeacher.code) => JsSuccess(HeadTeacher)
80+
case JsString(AssistantHeadTeacher.code) => JsSuccess(AssistantHeadTeacher)
81+
case JsString(HumanResourcesManager.code) => JsSuccess(HumanResourcesManager)
82+
case JsString(InformationOfficer.code) => JsSuccess(InformationOfficer)
83+
case JsString(MinisterOfReligion.code) => JsSuccess(MinisterOfReligion)
84+
case JsString(Principal.code) => JsSuccess(Principal)
85+
case JsString(Secretary.code) => JsSuccess(Secretary)
86+
case JsString(AssistantSecretary.code) => JsSuccess(AssistantSecretary)
87+
case JsString(Teacher.code) => JsSuccess(Teacher)
88+
case JsString(Treasurer.code) => JsSuccess(Treasurer)
89+
case JsString(AssistantTreasurer.code) => JsSuccess(AssistantTreasurer)
90+
case JsString(Trustee.code) => JsSuccess(Trustee)
91+
case JsString(UKAgent.code) => JsSuccess(UKAgent)
11592
case _ => JsError("error.invalid")
11693
}
11794

0 commit comments

Comments
 (0)