func stopWordsReply(g *G.Gilmour, stopList *[]string) func(req *G.Request, resp *G.Message) { return func(req *G.Request, resp *G.Message) { line := fmt.Sprintf("Filtering out stop words") g.Signal("example.log", G.NewMessage().SetData(line)) words := []string{} if err := req.Data(&words); err != nil { panic(words) } stopMap := map[string]bool{} for _, w := range *stopList { stopMap[w] = true } filtered := []string{} for _, w := range words { if _, ok := stopMap[w]; !ok { filtered = append(filtered, w) } } resp.SetData(filtered) } }
func generator(first, second float64, tick <-chan time.Time, e *G.Gilmour) { //Wait for a tick <-tick packet := map[string]float64{"first": first, "second": second} data := G.NewMessage().SetData(packet) req := e.NewRequest(fibTopic) resp, err := req.Execute(data) if err != nil { fmt.Println("Error in Handler", err) return } if resp.Code() != 200 { fmt.Println("Error in Handler", resp.Code()) return } var next float64 msg := resp.Next() if err := msg.GetData(&next); err != nil { fmt.Println(err) return } generator(second, next, tick, e) }
//Bind all service endpoints to their topics. func bindListeners(g *G.Gilmour) { //Third argument is for Opts, which in this case is nil g.ReplyTo("weather.fetch", fetchReply(g), nil) g.ReplyTo("weather.group", groupReply(g), nil) g.ReplyTo("weather.min", minReply(g), nil) g.ReplyTo("weather.max", maxReply(g), nil) }
func saveReply(g *G.Gilmour) func(req *G.Request, resp *G.Message) { return func(req *G.Request, resp *G.Message) { line := fmt.Sprintf("Save") g.Signal("example.log", G.NewMessage().SetData(line)) resp.SetData("Hello from Save") } }
func findReply(g *G.Gilmour) func(req *G.Request, resp *G.Message) { return func(req *G.Request, resp *G.Message) { line := fmt.Sprintf("Find") g.Signal("example.log", G.NewMessage().SetData(line)) input := getInput(req) resp.SetData(input) } }
func wordsReply(g *G.Gilmour) func(req *G.Request, resp *G.Message) { return func(req *G.Request, resp *G.Message) { line := fmt.Sprintf("WordCount") g.Signal("example.log", G.NewMessage().SetData(line)) input := getInput(req) wordRe := regexp.MustCompile("\\w+") words := wordRe.FindAllString(input, -1) resp.SetData(words) } }
func echoRequest(wg *sync.WaitGroup, engine *G.Gilmour, msg string) { req := engine.NewRequest("echo") resp, err := req.Execute(G.NewMessage().SetData(msg)) if err != nil { fmt.Println("Echoclient: error", err.Error()) } defer wg.Done() var output string if err := resp.Next().GetData(&output); err != nil { fmt.Println("Echoclient: error", err.Error()) } else { fmt.Println("Echoclient: received", output) } }
func countReply(g *G.Gilmour) func(req *G.Request, resp *G.Message) { return func(req *G.Request, resp *G.Message) { line := fmt.Sprintf("WordCount") g.Signal("example.log", G.NewMessage().SetData(line)) input := []string{} if err := req.Data(&input); err != nil { panic(err) } word_counts := make(map[string]int) for _, word := range input { word_counts[word]++ } resp.SetData(word_counts) } }
func popularReply(g *G.Gilmour, wordLen int) func(req *G.Request, resp *G.Message) { return func(req *G.Request, resp *G.Message) { line := fmt.Sprintf("Popular %v", wordLen) g.Signal("example.log", G.NewMessage().SetData(line)) input := map[string]int{} if err := req.Data(&input); err != nil { panic(err) } popular := map[int][]string{} score := []int{} for k, v := range input { if len(k) != wordLen { continue } popular[v] = append(popular[v], k) } for k := range popular { score = append(score, k) } sort.Sort(sort.Reverse(sort.IntSlice(score))) output := struct { WordLength int Score int Words []string }{WordLength: wordLen} if len(score) > 0 { output.Score = score[0] output.Words = popular[score[0]] } resp.SetData(output) } }
//Fetch a remote file from the URL received in Request. func fetchReply(g *G.Gilmour) func(req *G.Request, resp *G.Message) { return func(req *G.Request, resp *G.Message) { url := getInput(req) line := fmt.Sprintf("Fetch %v", url) g.Signal("example.log", G.NewMessage().SetData(line)) response, err := http.Get(url) if err != nil { panic(err) } defer response.Body.Close() contents, err := ioutil.ReadAll(response.Body) if err != nil { panic(err) } //Send back the contents. resp.SetData(string(contents)) } }
func bindListeners(e *G.Gilmour) { o := G.NewHandlerOpts().SetGroup(fibTopic) e.ReplyTo(fibTopic, fibRequest, o) }
func bindListeners(g *G.Gilmour) { opts := G.NewHandlerOpts().SetGroup("exclusive") g.ReplyTo("echo", echoReply, opts) }
//Bind all service endpoints to their topics. func bindListeners(g *G.Gilmour) { //Third argument is for Opts, which in this case is nil g.ReplyTo("example.fetch", fetchReply(g), nil) g.ReplyTo("example.words", wordsReply(g), nil) g.ReplyTo("example.count", countReply(g), nil) g.ReplyTo("example.stopfilter", stopWordsReply(g, &stopWords), nil) g.ReplyTo("example.popular3", popularReply(g, 3), nil) g.ReplyTo("example.popular4", popularReply(g, 4), nil) g.ReplyTo("example.popular5", popularReply(g, 5), nil) g.ReplyTo("example.find", findReply(g), nil) g.ReplyTo("example.save", saveReply(g), nil) }
func glog(g *G.Gilmour, msg string) { g.Signal("example.log", G.NewMessage().SetData(msg)) }