aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorOskari Timperi <oskari.timperi@iki.fi>2018-04-21 21:45:04 +0100
committerOskari Timperi <oskari.timperi@iki.fi>2018-04-21 21:46:10 +0100
commit4b058c8d8cc83f0e5edf73307530d8ea065d33f1 (patch)
treee4e7c3ac34e8ca310f932519f153dedf02ec45db /examples
parentb2b01b74910f455d2d010ba659e6e7514ea79489 (diff)
downloadnimtwirp-4b058c8d8cc83f0e5edf73307530d8ea065d33f1.tar.gz
nimtwirp-4b058c8d8cc83f0e5edf73307530d8ea065d33f1.zip
Move Haberdasher example under examples dir
Diffstat (limited to 'examples')
-rw-r--r--examples/haberdasher/Makefile10
-rw-r--r--examples/haberdasher/README.md3
-rw-r--r--examples/haberdasher/haberdasherclient.nim25
-rw-r--r--examples/haberdasher/haberdasherserver.nim47
-rw-r--r--examples/haberdasher/nim.cfg1
-rw-r--r--examples/haberdasher/service.proto22
6 files changed, 108 insertions, 0 deletions
diff --git a/examples/haberdasher/Makefile b/examples/haberdasher/Makefile
new file mode 100644
index 0000000..309144f
--- /dev/null
+++ b/examples/haberdasher/Makefile
@@ -0,0 +1,10 @@
+all: haberdasherserver haberdasherclient
+
+haberdasherserver: haberdasherserver.nim service_pb.nim service_twirp.nim
+ nim c haberdasherserver.nim
+
+haberdasherclient: haberdasherclient.nim service_pb.nim service_twirp.nim
+ nim c haberdasherclient.nim
+
+%_pb.nim %_twirp.nim: %.proto
+ ../../nimtwirp/nimtwirp_build -I:. --out:. $^
diff --git a/examples/haberdasher/README.md b/examples/haberdasher/README.md
new file mode 100644
index 0000000..acdee60
--- /dev/null
+++ b/examples/haberdasher/README.md
@@ -0,0 +1,3 @@
+# Nimtwirp usage example
+
+This example is basically stolen from [twirp](https://twitchtv.github.io/twirp/docs/example.html).
diff --git a/examples/haberdasher/haberdasherclient.nim b/examples/haberdasher/haberdasherclient.nim
new file mode 100644
index 0000000..d402356
--- /dev/null
+++ b/examples/haberdasher/haberdasherclient.nim
@@ -0,0 +1,25 @@
+import os
+import strformat
+import strutils
+
+import service_pb
+import service_twirp
+
+if paramCount() != 1:
+ echo("usage: " & getAppFilename() & " <size>")
+ quit(QuitFailure)
+
+var size = newtwirp_example_haberdasher_Size()
+try:
+ size.inches = parseInt(paramStr(1)).int32
+except:
+ echo("invalid size")
+ quit(QuitFailure)
+
+let client = newHaberdasherClient("http://localhost:8080")
+
+try:
+ let hat = MakeHat(client, size)
+ echo(&"I have a nice new hat: {hat.inches} inch {hat.color} {hat.name}")
+except Exception as exc:
+ echo(&"oh no: {exc.msg}")
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()
diff --git a/examples/haberdasher/nim.cfg b/examples/haberdasher/nim.cfg
new file mode 100644
index 0000000..e5cb567
--- /dev/null
+++ b/examples/haberdasher/nim.cfg
@@ -0,0 +1 @@
+--path="../.."
diff --git a/examples/haberdasher/service.proto b/examples/haberdasher/service.proto
new file mode 100644
index 0000000..1945a72
--- /dev/null
+++ b/examples/haberdasher/service.proto
@@ -0,0 +1,22 @@
+syntax = "proto3";
+
+package twirp.example.haberdasher;
+option go_package = "haberdasher";
+
+// Haberdasher service makes hats for clients.
+service Haberdasher {
+ // MakeHat produces a hat of mysterious, randomly-selected color!
+ rpc MakeHat(Size) returns (Hat);
+}
+
+// Size of a Hat, in inches.
+message Size {
+ int32 inches = 1; // must be > 0
+}
+
+// A Hat is a piece of headwear made by a Haberdasher.
+message Hat {
+ int32 inches = 1;
+ string color = 2; // anything but "invisible"
+ string name = 3; // i.e. "bowler"
+}