A set of refinement types for Google's Guava library.
Code samples assume these imports:
import java.net.InetAddress
import com.google.common.net.InternetDomainName
import eu.timepit.refined.api.Refined
import eu.timepit.refined.auto._
import refined.guava.net._
import refined.guava.net.net.IP
Checking values at compile-time using helper functions:
val ipv4Loopback: InetAddress = ip("127.0.0.1")
// ipv4Loopback: java.net.InetAddress = /127.0.0.1
val hostname: InternetDomainName = dns("foo.org.co.uk")
// hostname: com.google.common.net.InternetDomainName = foo.org.co.uk
Values can also be checked using refinement predicates:
val dns1: String Refined IP = "2001:db8::f00:123"
// dns1: eu.timepit.refined.api.Refined[String,refined.guava.net.net.IP] = 2001:db8::f00:123
These examples won't compile because they fail validation:
val notAnIp = ip("hello")
// <console>:22: error: IP Address predicate failed: 'hello' is not an IP string literal.
// val notAnIp = ip("hello")
// ^
val notAHostname = dns("rm -rf /")
// <console>:22: error: DNS name predicate failed: Not a valid domain name: 'rm -rf /'
// val notAHostname = dns("rm -rf /")
// ^
To run unit tests, run
sbt test
To generate a code coverage report run,
sbt clean coverage test coverageReport
The HTML report will be written to target/scala-2.12/scoverage-report/index.html
.
The project uses the scapegoat tool for code quality analysis. Run run a scapegoat report, run
sbt scapegoat
The HTML report will be written to target/scala-2.12/scapegoat-report/scapegoat.html