1
0
Fork 0
shezmu/caller
Gregory Eremin e08841fdc7 Improve caller readme and package description 2015-10-14 03:18:36 +03:00
..
README.md Improve caller readme and package description 2015-10-14 03:18:36 +03:00
caller.go Improve caller readme and package description 2015-10-14 03:18:36 +03:00
caller_test.go Add caller package 2015-10-14 00:08:45 +03:00

README.md

Caller

Package caller is used to dynamically call functions with data unmarshalled into the functions' first argument. Its main purpose is to hide common unmarshalling code from each function implementation thus reducing boilerplate and making package interaction code sexier.

Documentation

Example

package main

import (
    "log"
    "github.com/localhots/uberdaemon/caller"
    "github.com/path/to/package/messenger"
)

type PriceUpdate struct {
    Product string  `json:"product"`
    Amount  float32 `json:"amount"`
}

func main() {
    messenger.Subscribe("ProductPriceUpdates", func(p PriceUpdate) {
        log.Printf("Price for %q is now $%.2f", p.Product, p.Amount)
    })
    messenger.Deliver()
}

Support code:

package messenger

import (
    "github.com/localhots/uberdaemon/caller"
)

type item struct {
    topic   string
    payload []byte
}

var queue <-chan item
var subscriptions = make(map[string][]*caller.Caller)

func Subscribe(topic string, callback interface{}) {
    c, err := caller.New(processMessage)
    if err != nil {
        panic(err)
    }
    subcriptions[topic] = append(subcriptions[topic], c)
}

func Deliver() {
    for itm := range queue {
        for _, c := range subscriptions[itm.topic] {
            // Payload example:
            // {"product": "Paperclip", "amount": 0.01}
            c.Call(itm.payload)
        }
    }
}