Refined Network Types
Import
import refined4s.types.all.*
Refined Uri
Uri is a refined String type that accepts only valid URI values.
Compile-time Validation
Uri("https://www.google.com")
// res0: Type = "https://www.google.com"
Uri("https://github.com/kevin-lee")
// res1: Type = "https://github.com/kevin-lee"
Uri("%^<>[]`{}")
// error:
// Invalid value: ["%^<>[]`{}"]. It must be a URI String
Runtime Validation
val validUri1 = "https://www.google.com"
// validUri1: String = "https://www.google.com"
Uri.from(validUri1)
// res2: Either[String, Uri] = Right(value = "https://www.google.com")
val validUri2 = "https://github.com/kevin-lee"
// validUri2: String = "https://github.com/kevin-lee"
Uri.from(validUri2)
// res3: Either[String, Uri] = Right(value = "https://github.com/kevin-lee")
val invalidUri = "%^<>[]`{}"
// invalidUri: String = "%^<>[]`{}"
Uri.from(invalidUri)
// res4: Either[String, Uri] = Left(
// value = "Invalid Uri value: [%^<>[]`{}]. Malformed escape pair at index 0: %^<>[]`{}"
// )
Get Value
val uriA = Uri("https://www.google.com")
// uriA: Type = "https://www.google.com"
val uriB = Uri("https://github.com/kevin-lee")
// uriB: Type = "https://github.com/kevin-lee"
uriA.value
// res5: String = "https://www.google.com"
uriB.value
// res6: String = "https://github.com/kevin-lee"
Convert to java.net.URI
uriA.toURI
// res7: URI = https://www.google.com
uriB.toURI
// res8: URI = https://github.com/kevin-lee
Refined Url
Url is a refined String type that accepts only valid URL values with supported protocols.
Compile-time Validation
Url("https://www.google.com")
// res9: Type = "https://www.google.com"
Url("https://github.com/kevin-lee")
// res10: Type = "https://github.com/kevin-lee"
Url("blah://test.com")
// Url("blah://test.com")
// ^^^^^^^^^^^^^^^^^^^^^^
// Invalid Url value: [blah://test.com]. unknown protocol: blah
Runtime Validation
val validUrl1 = "https://www.google.com"
// validUrl1: String = "https://www.google.com"
Url.from(validUrl1)
// res11: Either[String, Url] = Right(value = "https://www.google.com")
val validUrl2 = "https://github.com/kevin-lee"
// validUrl2: String = "https://github.com/kevin-lee"
Url.from(validUrl2)
// res12: Either[String, Url] = Right(value = "https://github.com/kevin-lee")
val invalidUrl = "%^<>[]`{}"
// invalidUrl: String = "%^<>[]`{}"
Url.from(invalidUrl)
// res13: Either[String, Url] = Left(
// value = "Invalid Url value: [%^<>[]`{}]. no protocol: %^<>[]`{}"
// )
Get Value
val urlA = Url("https://www.google.com")
// urlA: Type = "https://www.google.com"
val urlB = Url("https://github.com/kevin-lee")
// urlB: Type = "https://github.com/kevin-lee"
urlA.value
// res14: String = "https://www.google.com"
urlB.value
// res15: String = "https://github.com/kevin-lee"
Convert to java.net.URI
urlA.toURI
// res16: URI = https://www.google.com
urlB.toURI
// res17: URI = https://github.com/kevin-lee
Refined PortNumber
PortNumber is a refined Int type for valid TCP/UDP port numbers in the range 0 to 65535.
Compile-time Validation
PortNumber(0)
// res18: Type = 0
PortNumber(65535)
// res19: Type = 65535
PortNumber(-1)
// PortNumber(-1)
// ^^^^^^^^^^^^^^
// Invalid value: [-1]. It has to be Int between 0 and 65535 (0 <= PortNumber <= 65535)
PortNumber(65536)
// PortNumber(65536)
// ^^^^^^^^^^^^^^^^^
// Invalid value: [65536]. It has to be Int between 0 and 65535 (0 <= PortNumber <= 65535)
Runtime Validation
val validPortNumber1 = 0
// validPortNumber1: Int = 0
PortNumber.from(validPortNumber1)
// res20: Either[String, Type] = Right(value = 0)
val validPortNumber2 = 65535
// validPortNumber2: Int = 65535
PortNumber.from(validPortNumber2)
// res21: Either[String, Type] = Right(value = 65535)
val invalidPortNumber1 = -1
// invalidPortNumber1: Int = -1
PortNumber.from(invalidPortNumber1)
// res22: Either[String, Type] = Left(
// value = "Invalid value: [-1]. It has to be Int between 0 and 65535 (0 <= PortNumber <= 65535)"
// )
val invalidPortNumber2 = 65536
// invalidPortNumber2: Int = 65536
PortNumber.from(invalidPortNumber2)
// res23: Either[String, Type] = Left(
// value = "Invalid value: [65536]. It has to be Int between 0 and 65535 (0 <= PortNumber <= 65535)"
// )
Get Value
val portNumberA = PortNumber(80)
// portNumberA: Type = 80
val portNumberB = PortNumber(9000)
// portNumberB: Type = 9000
portNumberA.value
// res24: Int = 80
portNumberB.value
// res25: Int = 9000
Refined SystemPortNumber
SystemPortNumber is a refined Int type for system ports in the range 0 to 1023.
Compile-time Validation
SystemPortNumber(0)
// res26: Type = 0
SystemPortNumber(1023)
// res27: Type = 1023
SystemPortNumber(-1)
// SystemPortNumber(-1)
// ^^^^^^^^^^^^^^^^^^^^
// Invalid value: [-1]. It has to be Int between 0 and 1023 (0 <= SystemPortNumber <= 1023)
SystemPortNumber(1024)
// SystemPortNumber(1024)
// ^^^^^^^^^^^^^^^^^^^^^^
// Invalid value: [1024]. It has to be Int between 0 and 1023 (0 <= SystemPortNumber <= 1023)
Runtime Validation
val validSystemPortNumber1 = 0
// validSystemPortNumber1: Int = 0
SystemPortNumber.from(validSystemPortNumber1)
// res28: Either[String, Type] = Right(value = 0)
val validSystemPortNumber2 = 1023
// validSystemPortNumber2: Int = 1023
SystemPortNumber.from(validSystemPortNumber2)
// res29: Either[String, Type] = Right(value = 1023)
val invalidSystemPortNumber1 = -1
// invalidSystemPortNumber1: Int = -1
SystemPortNumber.from(invalidSystemPortNumber1)
// res30: Either[String, Type] = Left(
// value = "Invalid value: [-1]. It has to be Int between 0 and 1023 (0 <= SystemPortNumber <= 1023)"
// )
val invalidSystemPortNumber2 = 1024
// invalidSystemPortNumber2: Int = 1024
SystemPortNumber.from(invalidSystemPortNumber2)
// res31: Either[String, Type] = Left(
// value = "Invalid value: [1024]. It has to be Int between 0 and 1023 (0 <= SystemPortNumber <= 1023)"
// )
Get Value
val systemPortNumberA = SystemPortNumber(22)
// systemPortNumberA: Type = 22
val systemPortNumberB = SystemPortNumber(80)
// systemPortNumberB: Type = 80
systemPortNumberA.value
// res32: Int = 22
systemPortNumberB.value
// res33: Int = 80
Refined NonSystemPortNumber
NonSystemPortNumber is a refined Int type for non-system ports in the range 1024 to 65535.
Compile-time Validation
NonSystemPortNumber(1024)
// res34: Type = 1024
NonSystemPortNumber(65535)
// res35: Type = 65535
NonSystemPortNumber(1023)
// NonSystemPortNumber(1023)
// ^^^^^^^^^^^^^^^^^^^^^^^^^
// Invalid value: [1023]. It has to be Int between 1024 and 65535 (1024 <= NonSystemPortNumber <= 65535)
NonSystemPortNumber(65536)
// NonSystemPortNumber(65536)
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
// Invalid value: [65536]. It has to be Int between 1024 and 65535 (1024 <= NonSystemPortNumber <= 65535)
Runtime Validation
val validNonSystemPortNumber1 = 1024
// validNonSystemPortNumber1: Int = 1024
NonSystemPortNumber.from(validNonSystemPortNumber1)
// res36: Either[String, Type] = Right(value = 1024)
val validNonSystemPortNumber2 = 65535
// validNonSystemPortNumber2: Int = 65535
NonSystemPortNumber.from(validNonSystemPortNumber2)
// res37: Either[String, Type] = Right(value = 65535)
val invalidNonSystemPortNumber1 = 1023
// invalidNonSystemPortNumber1: Int = 1023
NonSystemPortNumber.from(invalidNonSystemPortNumber1)
// res38: Either[String, Type] = Left(
// value = "Invalid value: [1023]. It has to be Int between 1024 and 65535 (1024 <= NonSystemPortNumber <= 65535)"
// )
val invalidNonSystemPortNumber2 = 65536
// invalidNonSystemPortNumber2: Int = 65536
NonSystemPortNumber.from(invalidNonSystemPortNumber2)
// res39: Either[String, Type] = Left(
// value = "Invalid value: [65536]. It has to be Int between 1024 and 65535 (1024 <= NonSystemPortNumber <= 65535)"
// )
Get Value
val nonSystemPortNumberA = NonSystemPortNumber(8080)
// nonSystemPortNumberA: Type = 8080
val nonSystemPortNumberB = NonSystemPortNumber(54321)
// nonSystemPortNumberB: Type = 54321
nonSystemPortNumberA.value
// res40: Int = 8080
nonSystemPortNumberB.value
// res41: Int = 54321
Refined UserPortNumber
UserPortNumber is a refined Int type for user (registered) ports in the range 1024 to 49151.
Compile-time Validation
UserPortNumber(1024)
// res42: Type = 1024
UserPortNumber(49151)
// res43: Type = 49151
UserPortNumber(1023)
// UserPortNumber(1023)
// ^^^^^^^^^^^^^^^^^^^^
// Invalid value: [1023]. It has to be Int between 1024 and 49151 (1024 <= UserPortNumber <= 49151)
UserPortNumber(49152)
// UserPortNumber(49152)
// ^^^^^^^^^^^^^^^^^^^^^
// Invalid value: [49152]. It has to be Int between 1024 and 49151 (1024 <= UserPortNumber <= 49151)
Runtime Validation
val validUserPortNumber1 = 1024
// validUserPortNumber1: Int = 1024
UserPortNumber.from(validUserPortNumber1)
// res44: Either[String, Type] = Right(value = 1024)
val validUserPortNumber2 = 49151
// validUserPortNumber2: Int = 49151
UserPortNumber.from(validUserPortNumber2)
// res45: Either[String, Type] = Right(value = 49151)
val invalidUserPortNumber1 = 1023
// invalidUserPortNumber1: Int = 1023
UserPortNumber.from(invalidUserPortNumber1)
// res46: Either[String, Type] = Left(
// value = "Invalid value: [1023]. It has to be Int between 1024 and 49151 (1024 <= UserPortNumber <= 49151)"
// )
val invalidUserPortNumber2 = 49152
// invalidUserPortNumber2: Int = 49152
UserPortNumber.from(invalidUserPortNumber2)
// res47: Either[String, Type] = Left(
// value = "Invalid value: [49152]. It has to be Int between 1024 and 49151 (1024 <= UserPortNumber <= 49151)"
// )
Get Value
val userPortNumberA = UserPortNumber(8888)
// userPortNumberA: Type = 8888
val userPortNumberB = UserPortNumber(33333)
// userPortNumberB: Type = 33333
userPortNumberA.value
// res48: Int = 8888
userPortNumberB.value
// res49: Int = 33333
Refined DynamicPortNumber
DynamicPortNumber is a refined Int type for dynamic/private ports in the range 49152 to 65535.
Compile-time Validation
DynamicPortNumber(49152)
// res50: Type = 49152
DynamicPortNumber(65535)
// res51: Type = 65535
DynamicPortNumber(49151)
// DynamicPortNumber(49151)
// ^^^^^^^^^^^^^^^^^^^^^^^^
// Invalid value: [49151]. It has to be Int between 49152 and 65535 (49152 <= DynamicPortNumber <= 65535)
DynamicPortNumber(65536)
// DynamicPortNumber(65536)
// ^^^^^^^^^^^^^^^^^^^^^^^^
// Invalid value: [65536]. It has to be Int between 49152 and 65535 (49152 <= DynamicPortNumber <= 65535)
Runtime Validation
val validDynamicPortNumber1 = 49152
// validDynamicPortNumber1: Int = 49152
DynamicPortNumber.from(validDynamicPortNumber1)
// res52: Either[String, Type] = Right(value = 49152)
val validDynamicPortNumber2 = 65535
// validDynamicPortNumber2: Int = 65535
DynamicPortNumber.from(validDynamicPortNumber2)
// res53: Either[String, Type] = Right(value = 65535)
val invalidDynamicPortNumber1 = 49151
// invalidDynamicPortNumber1: Int = 49151
DynamicPortNumber.from(invalidDynamicPortNumber1)
// res54: Either[String, Type] = Left(
// value = "Invalid value: [49151]. It has to be Int between 49152 and 65535 (49152 <= DynamicPortNumber <= 65535)"
// )
val invalidDynamicPortNumber2 = 65536
// invalidDynamicPortNumber2: Int = 65536
DynamicPortNumber.from(invalidDynamicPortNumber2)
// res55: Either[String, Type] = Left(
// value = "Invalid value: [65536]. It has to be Int between 49152 and 65535 (49152 <= DynamicPortNumber <= 65535)"
// )
Get Value
val dynamicPortNumberA = DynamicPortNumber(55555)
// dynamicPortNumberA: Type = 55555
val dynamicPortNumberB = DynamicPortNumber(65432)
// dynamicPortNumberB: Type = 65432
dynamicPortNumberA.value
// res56: Int = 55555
dynamicPortNumberB.value
// res57: Int = 65432