-
Notifications
You must be signed in to change notification settings - Fork 0
/
http4s.scala
69 lines (62 loc) · 1.78 KB
/
http4s.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//> using scala "3.1.1"
//> using platform "scala-js"
//> using jsVersion "1.9.0"
//> using jsHeader "#!/usr/bin/env node\n"
//> using jsEmitSourceMaps true
//> using jsModuleKind "CommonJS"
//> using lib "org.http4s::http4s-ember-server::0.23.8"
//> using lib "com.monovore::decline-effect::2.2.0"
import cats.effect.*
import cats.syntax.all.*
import com.comcast.ip4s.*
import com.monovore.decline.*
import com.monovore.decline.effect.*
import org.http4s.ember.server.*
import org.http4s.server
import org.http4s.server.staticcontent.*
object Http4sCli
extends CommandIOApp(
name = "http4s",
header = "static file server, backed by http4s ember",
version = "0.1.0"
):
val port = Opts
.argument[Int](metavar = "port")
.withDefault(8000)
.mapValidated(p =>
Port.fromInt(p).toRightNel(s"Invalid port: $p").toValidated
)
val bind = Opts
.option[String](
"bind",
short = "b",
metavar = "ADDRESS",
help = "Specify alternate bind address [default: all interfaces]"
)
.withDefault("0.0.0.0")
.mapValidated(a =>
IpAddress.fromString(a).toRightNel(s"Invalid address: $a").toValidated
)
val dir = Opts
.option[String](
"directory",
short = "d",
metavar = "DIRECTORY",
help = "Specify alternative directory [default: current directory]"
)
.withDefault(".")
def routes(path: String) = fileService[IO](FileService.Config(path))
def main = (port, bind, dir).mapN { (p, b, d) =>
EmberServerBuilder
.default[IO]
.withHost(b)
.withPort(p)
.withHttpApp(routes(d).orNotFound)
.build
.evalTap(s =>
IO.println(
s"Serving HTTP on ${s.address.host} port ${s.address.port} (http://${s.address}/)"
)
)
.useForever
}