Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/0.23-scala3' into merge-0.23-to-…
Browse files Browse the repository at this point in the history
…0.23-scala3
  • Loading branch information
froth committed Jul 25, 2024
2 parents b329483 + 83313e8 commit da9dc3b
Show file tree
Hide file tree
Showing 10 changed files with 31 additions and 242 deletions.

This file was deleted.

8 changes: 1 addition & 7 deletions src/main/g8/build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,16 @@ lazy val root = (project in file("."))
organization := "$organization$",
name := "$name;format="norm"$",
version := "0.0.1-SNAPSHOT",
scalaVersion := "$scala_version$",
scalaVersion := "3.3.3",
libraryDependencies ++= Seq(
"org.http4s" %% "http4s-ember-server" % Http4sVersion,
"org.http4s" %% "http4s-ember-client" % Http4sVersion,
"org.http4s" %% "http4s-circe" % Http4sVersion,
"org.http4s" %% "http4s-dsl" % Http4sVersion,
"io.circe" %% "circe-generic" % CirceVersion,
"org.scalameta" %% "munit" % MunitVersion % Test,
"org.typelevel" %% "munit-cats-effect" % MunitCatsEffectVersion % Test,
"ch.qos.logback" % "logback-classic" % LogbackVersion,
$if(graal_native_image.truthy)$
"org.scalameta" % "svm-subs" % "101.0.0"
$endif$
),
addCompilerPlugin("org.typelevel" %% "kind-projector" % "0.13.3" cross CrossVersion.full),
addCompilerPlugin("com.olegpy" %% "better-monadic-for" % "0.3.1"),
assembly / assemblyMergeStrategy := {
case "module-info.class" => MergeStrategy.discard
case x => (assembly / assemblyMergeStrategy).value.apply(x)
Expand Down
6 changes: 0 additions & 6 deletions src/main/g8/default.properties
Original file line number Diff line number Diff line change
@@ -1,9 +1,3 @@
name = quickstart
organization = com.example
package = $organization$.$name;format="norm,word"$

scala_version = 2.13.14
# graal_vm_specific
graal_native_image = true
is_linux_build = false
scala_assembly_target = scala-2.13

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,22 @@ import cats.effect.IO
import org.http4s.HttpRoutes
import org.http4s.dsl.io._

object $name;format="Camel"$Routes {
object $name;format="Camel"$Routes:

def jokeRoutes(J: Jokes): HttpRoutes[IO] = {
def jokeRoutes(J: Jokes): HttpRoutes[IO] =
HttpRoutes.of[IO] {
case GET -> Root / "joke" =>
for {
joke <- J.get
resp <- Ok(joke)
} yield resp
}
}

def helloWorldRoutes(H: HelloWorld): HttpRoutes[IO] = {
def helloWorldRoutes(H: HelloWorld): HttpRoutes[IO] =
HttpRoutes.of[IO] {
case GET -> Root / "hello" / name =>
for {
greeting <- H.hello(HelloWorld.Name(name))
resp <- Ok(greeting)
} yield resp
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@ package $package$

import cats.effect.IO
import cats.implicits._
import org.http4s.implicits._
import com.comcast.ip4s._
import org.http4s.ember.client.EmberClientBuilder
import org.http4s.ember.server.EmberServerBuilder
import org.http4s.implicits._
import org.http4s.server.middleware.Logger

object $name;format="Camel"$Server {
object $name;format="Camel"$Server:

def run: IO[Nothing] = {
for {
def run: IO[Nothing] =
(for {
client <- EmberClientBuilder.default[IO].build
helloWorldAlg = HelloWorld.impl
jokeAlg = Jokes.impl(client)
Expand All @@ -34,6 +34,4 @@ object $name;format="Camel"$Server {
.withPort(port"8080")
.withHttpApp(finalHttpApp)
.build
} yield ()
}.useForever
}
} yield ()).useForever
18 changes: 7 additions & 11 deletions src/main/g8/src/main/scala/$package__packaged$/HelloWorld.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,30 +6,26 @@ import io.circe.{Encoder, Json}
import org.http4s.EntityEncoder
import org.http4s.circe._

trait HelloWorld{
trait HelloWorld:
def hello(n: HelloWorld.Name): IO[HelloWorld.Greeting]
}

object HelloWorld {
object HelloWorld:
final case class Name(name: String) extends AnyVal
/**
* More generally you will want to decouple your edge representations from
* your internal data structures, however this shows how you can
* create encoders for your data.
**/
final case class Greeting(greeting: String) extends AnyVal
object Greeting {
implicit val greetingEncoder: Encoder[Greeting] = new Encoder[Greeting] {
object Greeting:
given Encoder[Greeting] = new Encoder[Greeting]:
final def apply(a: Greeting): Json = Json.obj(
("message", Json.fromString(a.greeting)),
)
}
implicit val greetingEntityEncoder: EntityEncoder[IO, Greeting] =

given EntityEncoder[IO, Greeting] =
jsonEncoderOf[IO, Greeting]
}

def impl: HelloWorld = new HelloWorld{
def impl: HelloWorld = new HelloWorld:
def hello(n: HelloWorld.Name): IO[HelloWorld.Greeting] =
Greeting("Hello, " + n.name).pure[IO]
}
}
25 changes: 11 additions & 14 deletions src/main/g8/src/main/scala/$package__packaged$/Jokes.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,34 +2,31 @@ package $package$

import cats.effect.IO
import cats.implicits._
import io.circe.generic.semiauto._
import io.circe.{Decoder, Encoder}
import io.circe._
import org.http4s.Method._
import org.http4s._
import org.http4s.circe._
import org.http4s.client.Client
import org.http4s.client.dsl.io._
import org.http4s.implicits._

trait Jokes{
trait Jokes:
def get: IO[Jokes.Joke]
}

object Jokes {
final case class Joke(joke: String) extends AnyVal
object Joke {
implicit val jokeDecoder: Decoder[Joke] = deriveDecoder[Joke]
implicit val jokeEntityDecoder: EntityDecoder[IO, Joke] = jsonOf
implicit val jokeEncoder: Encoder[Joke] = deriveEncoder[Joke]
implicit val jokeEntityEncoder: EntityEncoder[IO, Joke] = jsonEncoderOf
}
object Jokes:
final case class Joke(joke: String)

object Joke:
given Decoder[Joke] = Decoder.derived[Joke]
given EntityDecoder[IO, Joke] = jsonOf
given Encoder[Joke] = Encoder.AsObject.derived[Joke]
given EntityEncoder[IO, Joke] = jsonEncoderOf

final case class JokeError(e: Throwable) extends RuntimeException

def impl(C: Client[IO]): Jokes = new Jokes{
def impl(C: Client[IO]): Jokes = new Jokes:
def get: IO[Jokes.Joke] = {
C.expect[Joke](GET(uri"https://icanhazdadjoke.com/"))
.adaptError{ case t => JokeError(t)} // Prevent Client Json Decoding Failure Leaking
}
}
}
6 changes: 3 additions & 3 deletions src/main/g8/src/main/scala/$package__packaged$/Main.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@ package $package$

import cats.effect.{IO, IOApp}

object Main extends IOApp.Simple {
def run:IO[Unit] = $name;format="Camel"$Server.run
}
object Main extends IOApp.Simple:
override def run: IO[Unit] =
$name;format="Camel"$Server.run
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import org.http4s._
import org.http4s.implicits._
import munit.CatsEffectSuite

class HelloWorldSpec extends CatsEffectSuite {
class HelloWorldSpec extends CatsEffectSuite:

test("HelloWorld returns status code 200") {
assertIO(retHelloWorld.map(_.status) ,Status.Ok)
Expand All @@ -20,4 +20,3 @@ class HelloWorldSpec extends CatsEffectSuite {
val helloWorld = HelloWorld.impl
$name;format="Camel"$Routes.helloWorldRoutes(helloWorld).orNotFound(getHW)
}
}

0 comments on commit da9dc3b

Please sign in to comment.