aboutsummaryrefslogtreecommitdiff
path: root/examples/haberdasher/haberdasherserver.nim
diff options
context:
space:
mode:
Diffstat (limited to 'examples/haberdasher/haberdasherserver.nim')
-rw-r--r--examples/haberdasher/haberdasherserver.nim47
1 files changed, 47 insertions, 0 deletions
diff --git a/examples/haberdasher/haberdasherserver.nim b/examples/haberdasher/haberdasherserver.nim
new file mode 100644
index 0000000..cdb25cb
--- /dev/null
+++ b/examples/haberdasher/haberdasherserver.nim
@@ -0,0 +1,47 @@
+import asynchttpserver
+import asyncdispatch
+import random
+
+import nimtwirp/nimtwirp
+import nimtwirp/errors
+
+import service_pb
+import service_twirp
+
+proc MakeHatImpl(service: Haberdasher, size: twirp_example_haberdasher_Size): Future[twirp_example_haberdasher_Hat] {.async.} =
+ if size.inches <= 0:
+ raise newTwirpError(TwirpInvalidArgument, "I can't make a hat that small!")
+
+ result = newtwirp_example_haberdasher_Hat()
+ result.inches = size.inches
+ result.color = rand(["white", "black", "brown", "red", "blue"])
+ result.name = rand(["bowler", "baseball cap", "top hat", "derby"])
+
+# You can do serving this way if you want to customize the process a bit
+
+var
+ server = newAsyncHttpServer()
+ service {.threadvar.}: Haberdasher
+
+service = newHaberdasher()
+service.MakeHatImpl = MakeHatImpl
+
+proc handler(req: Request) {.async.} =
+ # Each service will have a generated handleRequest() proc which takes the
+ # service object and a asynchttpserver.Request object and returns a
+ # Future[nimtwirp.Response].
+ var fut = handleRequest(service, req)
+ yield fut
+ if fut.failed:
+ await respond(req, nimtwirp.newResponse(fut.readError()))
+ else:
+ await respond(req, fut.read())
+
+waitFor server.serve(Port(8080), handler)
+
+# Or this way (idea copied from Jester) if your needs are simple.
+#
+#var settings = newSettings(8080)
+#twirpServices(settings):
+# service
+#runForever()