diff options
Diffstat (limited to 'examples/haberdasher')
| -rw-r--r-- | examples/haberdasher/Makefile | 10 | ||||
| -rw-r--r-- | examples/haberdasher/README.md | 3 | ||||
| -rw-r--r-- | examples/haberdasher/haberdasherclient.nim | 25 | ||||
| -rw-r--r-- | examples/haberdasher/haberdasherserver.nim | 47 | ||||
| -rw-r--r-- | examples/haberdasher/nim.cfg | 1 | ||||
| -rw-r--r-- | examples/haberdasher/service.proto | 22 |
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" +} |
