GitHub - gdefacci/raz: A scala DSL to create and match URI

Raz is a type safe scala DSL to create and match urls. The following example illustrates few features:

object Sample extends App {

  import com.github.gdefacci.raz._
  import PathConverter.{ Segment, Param, Fragment }

  val state = Path / "countries" / Segment.string / "states" / Segment.string
  val street = Path / "cities" / Segment.int && Param("street").string && Param("number").string

  assert("/countries/it/states/mi" == state.pathConverter.encode("it", "mi").render)
  assert("/countries/{country}/states/{state}" == state.pathConverter.encodeUriTemplate("country", "state").render)

  assert("/cities/123?street=Baker+street&number=12a" == street.pathConverter.encode(123, "Baker street", "12a").render)
  assert("/cities/{city-id}?street={street}&number={number}" == street.pathConverter.encodeUriTemplate("city-id", "street", "number").render)

  val absStreet = HTTP("mypage.com") / "app" / street.pathConverter

  assert("http://mypage.com/app/cities/123?street=Baker+street&number=12a" == absStreet.pathConverter.encode(123, "Baker street", "12a").render)

  val st2 = HTTP("mypage.com") / street.pathConverter
  st2.pathConverter.encode(123, "Baker street", "12a").render

  val fullAdrs = HTTP("mypage.com") / (state ++ street).pathConverter

  assert("http://mypage.com/countries/{country}/states/{state}/cities/{city}?street={street}&number={streetNumber}" ==
    fullAdrs.pathConverter.encodeUriTemplate("country", "state", "city", "street", "streetNumber").render)

  assert("http://mypage.com/countries/it/states/ts/cities/8?street=via+roma&number=12" ==
    fullAdrs.pathConverter.encode("it", "ts", 8, "via roma", "12").render)

  val pathAdrs = HTTP("mypage.com") / "countries" / "it" / "states" / "ts" / "cities" / "8" && ("street", "via roma") && ("number", "12")

  assert(fullAdrs.pathConverter.decodeFull(pathAdrs).toOption == Some(("it", "ts", 8, "via roma", "12")))

  case class Address(country: String, state: String, city: Int, street: String, streetNumber: String)

  val fullAdrs1 = fullAdrs.pathConverter.caseMap(Address.tupled)(Address.unapply)

  assert("http://mypage.com/countries/it/states/ts/cities/8?street=via+roma&number=12" ==
    fullAdrs1.pathConverter.encode(Address("it", "ts", 8, "via roma", "12")).render)

  assert(fullAdrs1.pathConverter.decodeFull(pathAdrs).toOption == Some(Address("it", "ts", 8, "via roma", "12")))
}

For more samples check

test folder sample project

Similar tools

Linx is a scala library with similar objectives. Compared to Linx, Raz enforse a little more type safety