| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // The following enables go generate to generate the doc.go file. |
| //go:generate go run $V23_ROOT/release/go/src/v.io/x/lib/cmdline/testdata/gendoc.go . -help |
| |
| package main |
| |
| import ( |
| "fmt" |
| "os" |
| |
| "v.io/x/lib/cmdline" |
| |
| "v.io/v23/context" |
| "v.io/v23/rpc" |
| "v.io/v23/security" |
| |
| "v.io/x/ref/examples/rps" |
| "v.io/x/ref/examples/rps/internal" |
| "v.io/x/ref/lib/v23cmd" |
| "v.io/x/ref/lib/xrpc" |
| |
| _ "v.io/x/ref/runtime/factories/roaming" |
| ) |
| |
| var aclFile string |
| |
| func main() { |
| cmdRoot.Flags.StringVar(&aclFile, "acl-file", "", "File containing JSON-encoded Permissions.") |
| cmdline.HideGlobalFlagsExcept() |
| cmdline.Main(cmdRoot) |
| } |
| |
| var cmdRoot = &cmdline.Command{ |
| Runner: v23cmd.RunnerFunc(runScoreKeeper), |
| Name: "rpsscorekeeper", |
| Short: "Implements the ScoreKeeper interface", |
| Long: ` |
| Command rpsscorekeeper implements the ScoreKeeper interface. It publishes |
| itself as a score keeper for the rock-paper-scissors game and prints out all the |
| score cards it receives to stdout. |
| `, |
| } |
| |
| type impl struct { |
| ch chan rps.ScoreCard |
| } |
| |
| func (i *impl) Record(ctx *context.T, call rpc.ServerCall, score rps.ScoreCard) error { |
| b, _ := security.RemoteBlessingNames(ctx, call.Security()) |
| ctx.VI(1).Infof("Record (%+v) from %v", score, b) |
| i.ch <- score |
| return nil |
| } |
| |
| func runScoreKeeper(ctx *context.T, env *cmdline.Env, args []string) error { |
| ch := make(chan rps.ScoreCard) |
| rpsService := &impl{ch} |
| hostname, err := os.Hostname() |
| if err != nil { |
| return fmt.Errorf("os.Hostname failed: %v", err) |
| } |
| name := fmt.Sprintf("rps/scorekeeper/%s", hostname) |
| service := rps.ScoreKeeperServer(rpsService) |
| authorizer := internal.NewAuthorizer(aclFile) |
| server, err := xrpc.NewServer(ctx, name, service, authorizer) |
| if err != nil { |
| return fmt.Errorf("NewServer failed: %v", err) |
| } |
| |
| ctx.Infof("Listening on endpoint /%s", server.Status().Endpoints[0]) |
| |
| for score := range ch { |
| fmt.Print("======================\n", internal.FormatScoreCard(score)) |
| } |
| return nil |
| } |