extras-type-info - Scala 3
types
import extras.typeinfo.syntax.types.*
nestedTypeName
import extras.typeinfo.syntax.types.*
sealed trait Foo
object Foo {
case object Bar extends Foo
final case class Baz(n: Int) extends Foo
def bar: Foo = Bar
def baz(n: Int): Foo = Baz(n)
}
Foo.Bar.nestedTypeName
// res1: String = "Foo.Bar"
Foo.Baz(1).nestedTypeName
// res2: String = "Foo.Baz"
Foo.bar.nestedTypeName
// res3: String = "Foo.Bar"
Foo.baz(1).nestedTypeName
// res4: String = "Foo.Baz"
import extras.typeinfo.syntax.types.*
enum Foo {
case Bar
case Baz(n: Int)
}
Foo.Bar.nestedTypeName
// res6: String = "Foo.Bar"
Foo.Baz(1).nestedTypeName
// res7: String = "Foo.Baz"
import extras.typeinfo.syntax.types.*
object data {
final case class Person(firstName: Person.FirstName, lastName: Person.LastName)
object Person {
type FirstName = FirstName.FirstName
object FirstName {
opaque
type FirstName = String
def apply(firstName: String): FirstName = firstName
given firstNameCanEqual: CanEqual[FirstName, FirstName]
= CanEqual.derived
extension(firstName: FirstName) {
def value: String = firstName
}
}
type LastName = LastName.LastName
object LastName {
opaque
type LastName = String
def apply(lastName: String): LastName = lastName
given lastNameCanEqual: CanEqual[LastName, LastName]
= CanEqual.derived
extension(lastName: LastName) {
def value: String = lastName
}
}
}
}
import data.*
val firstName = Person.FirstName("Kevin")
// firstName: FirstName = "Kevin"
val lastName = Person.LastName("Lee")
// lastName: LastName = "Lee"
firstName.nestedTypeName
// res9: String = "Person.FirstName"
lastName.nestedTypeName
// res10: String = "Person.LastName"
Person(firstName, lastName).nestedTypeName
// res11: String = "data.Person"