Skip to content

Instantly share code, notes, and snippets.

@progrium
Created August 25, 2021 15:59

Revisions

  1. progrium created this gist Aug 25, 2021.
    43 changes: 43 additions & 0 deletions server.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,43 @@
    // server.go
    package main

    import (
    "fmt"
    "log"
    "net"
    "strings"

    "github.com/progrium/qtalk-go/codec"
    "github.com/progrium/qtalk-go/fn"
    "github.com/progrium/qtalk-go/rpc"
    )

    type service struct{}

    func (svc *service) Upper(s string) string {
    return strings.ToUpper(s)
    }

    // methods can opt-in to receive the call as last argument.
    // also, errors can be returned to be received as remote errors.
    func (svc *service) Error(s string, c *rpc.Call) error {
    return fmt.Errorf("%s [%s]", s, c.Selector)
    }

    func main() {
    // create a tcp listener
    l, err := net.Listen("tcp", "localhost:9999")
    if err != nil {
    log.Fatal(err)
    }

    // setup a server using fn.HandlerFrom to
    // handle methods from the service type
    srv := &rpc.Server{
    Codec: codec.JSONCodec{},
    Handler: fn.HandlerFrom(new(service)),
    }

    // serve until the listener closes
    srv.Serve(l)
    }