Skip to content

Commit

Permalink
Merge d8eae9d into 1070dd3
Browse files Browse the repository at this point in the history
  • Loading branch information
bszwej committed Feb 17, 2019
2 parents 1070dd3 + d8eae9d commit 362fdd6
Show file tree
Hide file tree
Showing 6 changed files with 105 additions and 0 deletions.
1 change: 1 addition & 0 deletions build.sbt
Expand Up @@ -57,6 +57,7 @@ lazy val joda = module(project) in file("modules/joda")
lazy val `scala-xml` = module(project) in file("modules/scala-xml")
lazy val scalaz = module(project) in file("modules/scalaz")
lazy val squants = module(project) in file("modules/squants")
lazy val sttp = module(project) in file("modules/sttp")
lazy val yaml = module(project) in file("modules/yaml")

lazy val commonSettings = Seq(
Expand Down
1 change: 1 addition & 0 deletions docs/src/main/tut/docs/library-integrations.md
Expand Up @@ -23,6 +23,7 @@ The core of PureConfig eschews unnecessary dependencies. Separate modules exist
- [`pureconfig-scala-xml`](https://github.com/pureconfig/pureconfig/tree/master/modules/scala-xml) provides support for XML via [scala-xml](https://github.com/scala/scala-xml);
- [`pureconfig-scalaz`](https://github.com/pureconfig/pureconfig/tree/master/modules/scalaz) provides converters for [Scalaz](https://github.com/scalaz/scalaz) data structures and Scalaz typeclass instances;
- [`pureconfig-squants`](https://github.com/pureconfig/pureconfig/tree/master/modules/squants) provides converters for [Squants](http://www.squants.com/)'s beautiful types representing units of measure;
- [`pureconfig-sttp`](https://github.com/pureconfig/pureconfig/tree/master/modules/sttp) provides converters for [sttp](https://github.com/softwaremill/sttp) types;
- [`pureconfig-yaml`](https://github.com/pureconfig/pureconfig/tree/master/modules/yaml) provides support for reading YAML files as configurations.

### External Integrations
Expand Down
35 changes: 35 additions & 0 deletions modules/sttp/README.md
@@ -0,0 +1,35 @@
# sttp module for PureConfig

Adds support for [sttp](https://github.com/softwaremill/sttp). Currently supports only `com.softwaremill.sttp.Uri`.

## Add pureconfig-sttp to your project

In addition to [core PureConfig](https://github.com/pureconfig/pureconfig), you'll need:

```scala
libraryDependencies += "com.github.pureconfig" %% "pureconfig-sttp" % "0.10.2"
```

## Example

To load an sttp `Uri` into a configuration, create a new class:

```scala
import com.softwaremill.sttp.Uri
import com.typesafe.config.ConfigFactory.parseString
import pureconfig._
import pureconfig.generic.auto._
import pureconfig.module.sttp._

case class AppConfig(uri: Uri)
```

Now, we can load the configuration with the following code:

```scala
val config = parseString("""{uri: "https://sttp.readthedocs.io" }""")
// config: com.typesafe.config.Config = Config(SimpleConfigObject({"uri":"https://sttp.readthedocs.io"}))

loadConfig[AppConfig](config)
// res0: Either[pureconfig.error.ConfigReaderFailures,AppConfig] = Right(AppConfig(https://sttp.readthedocs.io))
```
13 changes: 13 additions & 0 deletions modules/sttp/build.sbt
@@ -0,0 +1,13 @@
name := "pureconfig-sttp"

libraryDependencies ++= Seq(
"com.softwaremill.sttp" %% "core" % "1.5.10")

developers := List(
Developer("bszwej", "Bartlomiej Szwej", "bszwej@gmail.com", url("https://github.com/bszwej")))

osgiSettings

OsgiKeys.exportPackage := Seq("pureconfig.module.sttp.*")
OsgiKeys.privatePackage := Seq()
OsgiKeys.importPackage := Seq(s"""scala.*;version="[${scalaBinaryVersion.value}.0,${scalaBinaryVersion.value}.50)"""", "*")
18 changes: 18 additions & 0 deletions modules/sttp/src/main/scala/pureconfig/module/sttp/package.scala
@@ -0,0 +1,18 @@
package pureconfig.module

import com.softwaremill.sttp._
import pureconfig.ConfigReader
import pureconfig.error.CannotConvert

import scala.util.Try

package object sttp {

implicit val reader: ConfigReader[Uri] =
ConfigReader.fromNonEmptyString { str
Try(uri"$str").fold(
ex Left(CannotConvert(str, "com.softwaremill.sttp.Uri", ex.getMessage)),
uri Right(uri))
}

}
37 changes: 37 additions & 0 deletions modules/sttp/src/test/scala/pureconfig/module/sttp/SttpSuite.scala
@@ -0,0 +1,37 @@
package pureconfig.module.sttp

import com.softwaremill.sttp._
import com.typesafe.config.ConfigFactory
import pureconfig.BaseSuite
import pureconfig.error.{ CannotConvert, ConfigReaderFailures, ConvertFailure }
import pureconfig.generic.auto._
import pureconfig.syntax._

class SttpSuite extends BaseSuite {

case class AppConfig(uri: Uri)

behavior of "sttp module"

it should "read uri" in {
val config = ConfigFactory.parseString("""{uri = "https://sttp.readthedocs.io"}""")

config.to[AppConfig].right.value shouldBe AppConfig(uri"https://sttp.readthedocs.io")
}

it should "handle error when reading uri" in {
val config = ConfigFactory.parseString("""{uri = "https!!://wrong.io"}""")

val failure =
ConvertFailure(
reason = CannotConvert(
value = "https!!://wrong.io",
toType = "com.softwaremill.sttp.Uri",
because = "requirement failed: Scheme can only contain alphanumeric characters, +, - and ."),
location = None,
path = "uri")

config.to[AppConfig].left.value shouldBe ConfigReaderFailures(failure)
}

}

0 comments on commit 362fdd6

Please sign in to comment.