本文整理汇总了Golang中github.com/goerlang/etf.Atom函数的典型用法代码示例。如果您正苦于以下问题:Golang Atom函数的具体用法?Golang Atom怎么用?Golang Atom使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了Atom函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: HandleCall
func (rpcs *rpcRex) HandleCall(message *etf.Term, from *etf.Tuple) (reply *etf.Term) {
nLog("REX: HandleCall: %#v, From: %#v", *message, *from)
var replyTerm etf.Term
valid := false
switch req := (*message).(type) {
case etf.Tuple:
if len(req) > 0 {
switch act := req[0].(type) {
case etf.Atom:
if string(act) == "call" {
valid = true
if fun, ok := rpcs.callMap[modFun{string(req[1].(etf.Atom)), string(req[2].(etf.Atom))}]; ok {
replyTerm = fun(req[3].(etf.List))
} else {
replyTerm = etf.Term(etf.Tuple{etf.Atom("badrpc"), etf.Tuple{etf.Atom("EXIT"), etf.Tuple{etf.Atom("undef"), etf.List{etf.Tuple{req[1], req[2], req[3], etf.List{}}}}}})
}
}
}
}
}
if !valid {
replyTerm = etf.Term(etf.Tuple{etf.Atom("badrpc"), etf.Atom("unknown")})
}
reply = &replyTerm
return
}
示例2: rpcShutdown
// shutdown request
// takes no arguments
func (r *Relay) rpcShutdown(terms etf.List) etf.Term {
if len(terms) != 0 {
return etf.Term(etf.Tuple{etf.Atom("error"), etf.Atom("badarith")})
}
r.shutdown()
r.shutdownChan <- struct{}{}
return etf.Term(etf.Atom("ok"))
}
示例3: HandleCall
// HandleCall handles incoming messages from `gen_server:call/2`, if returns non-nil term,
// then calling process have reply
// Call `gen_server:call({go_srv, [email protected]}, Message)` at Erlang node
func (gs *gonodeSrv) HandleCall(message *etf.Term, from *etf.Tuple) (reply *etf.Term) {
log.Printf("GO_SRV: HandleCall: %#v, From: %#v", *message, *from)
// Just create new term tuple where first element is atom 'ok', second 'go_reply' and third is original message
replyTerm := etf.Term(etf.Tuple{etf.Atom("ok"), etf.Atom("go_reply"), *message})
reply = &replyTerm
return
}
示例4: main
func main() {
// Parse CLI flags
flag.Parse()
setup_logging()
write_pid()
log.Println("node started")
// Initialize new node with given name and cookie
enode := node.NewNode(NodeName, Cookie)
// Allow node be available on EpmdPort port
err = enode.Publish(EpmdPort)
if err != nil {
log.Fatalf("Cannot publish: %s", err)
}
// Create channel to receive message when main process should be stopped
completeChan := make(chan bool)
// Initialize new instance of srv structure which implements Process behaviour
eSrv := new(srv)
// Spawn process with one arguments
enode.Spawn(eSrv, completeChan)
// RPC
if EnableRPC {
// Create closure
eClos := func(terms etf.List) (r etf.Term) {
r = etf.Term(etf.Tuple{etf.Atom("gonode"), etf.Atom("reply"), len(terms)})
return
}
// Provide it to call via RPC with `rpc:call([email protected], go_rpc, call, [as, qwe])`
err = enode.RpcProvide("go_rpc", "call", eClos)
if err != nil {
log.Printf("Cannot provide function to RPC: %s", err)
}
}
// Wait to stop
<-completeChan
log.Println("node finished")
return
}
示例5: createDevice
func (r *Relay) createDevice(fsName, deviceName string,
isSensor, isAffector bool) (etf.Atom, error) {
fs, ok := r.fss[fsName]
if !ok {
return etf.Atom(""), errors.New("no such fs")
}
device, err := fs.CreateDevice(deviceName, isSensor, isAffector)
if err != nil {
return etf.Atom(""), err
}
dp := newDeviceProc(device)
fullName := deviceName + "@" + fsName
r.node.Spawn(dp, fullName)
return etf.Atom(fullName), nil
}
示例6: registrator
func (n *Node) registrator() {
for {
select {
case req := <-n.registry.storeChan:
// FIXME: make proper allocation, now it just stub
var id uint32 = 0
for k, _ := range n.channels {
if k.Id >= id {
id = k.Id + 1
}
}
var pid etf.Pid
pid.Node = etf.Atom(n.FullName)
pid.Id = id
pid.Serial = 0 // FIXME
pid.Creation = byte(n.Creation)
n.channels[pid] = req.channels
req.replyTo <- pid
case req := <-n.registry.regNameChan:
n.registered[req.name] = req.pid
case req := <-n.registry.unregNameChan:
delete(n.registered, req.name)
}
}
}
示例7: handleTerms
func (currNode *Node) handleTerms(c net.Conn, wchan chan []etf.Term, terms []etf.Term) {
nLog("Node terms: %#v", terms)
if len(terms) == 0 {
return
}
switch t := terms[0].(type) {
case etf.Tuple:
if len(t) > 0 {
switch act := t.Element(1).(type) {
case int:
switch act {
case REG_SEND:
if len(terms) == 2 {
currNode.RegSend(t.Element(2), t.Element(4), terms[1])
} else {
nLog("*** ERROR: bad REG_SEND: %#v", terms)
}
default:
nLog("Unhandled node message (act %d): %#v", act, t)
}
case etf.Atom:
switch act {
case etf.Atom("$go_set_node"):
nLog("SET NODE %#v", t)
currNode.neighbors[t[1].(etf.Atom)] = nodeConn{conn: c, wchan: wchan}
}
default:
nLog("UNHANDLED ACT: %#v", t.Element(1))
}
}
}
}
示例8: Init
// Init initializes process state using arbitrary arguments
func (gs *gonodeSrv) Init(args ...interface{}) {
log.Printf("GO_SRV: Init: %#v", args)
// Self-registration with name go_srv
gs.Node.Register(etf.Atom("go_srv"), gs.Self)
// Store first argument as channel
gs.completeChan = args[0].(chan bool)
}
示例9: HandleCall
func (rpcs *rpcRex) HandleCall(message *etf.Term, from *etf.Tuple) (reply *etf.Term) {
nLog("REX: HandleCall: %#v, From: %#v", *message, *from)
switch req := (*message).(type) {
case etf.Tuple:
if len(req) > 0 {
switch act := req[0].(type) {
case etf.Atom:
if string(act) == "call" {
nLog("RPC CALL: Module: %#v, Function: %#v, Args: %#v, GroupLeader: %#v", req[1], req[2], req[3], req[4])
replyTerm := etf.Term(etf.Tuple{req[1], req[2]})
reply = &replyTerm
}
}
}
}
if reply == nil {
replyTerm := etf.Term(etf.Tuple{etf.Atom("badrpc"), etf.Atom("unknown")})
reply = &replyTerm
}
return
}
示例10: Send
// Send sends message to destination process withoud source
func (currNode *Node) Send(to etf.Pid, message etf.Term) {
nLog("Send: %#v, %#v", to, message)
if string(to.Node) == currNode.FullName {
nLog("Send to local node")
pcs := currNode.channels[to]
pcs.in <- message
} else {
nLog("Send to remote node: %#v, %#v", to, currNode.neighbors[to.Node])
msg := []etf.Term{etf.Tuple{SEND, etf.Atom(""), to}, message}
currNode.neighbors[to.Node].wchan <- msg
}
}
示例11: main
func main() {
// Initialize new node with given name and cookie
enode := node.NewNode("[email protected]", "123")
// Allow node be available on 5588 port
err := enode.Publish(5588)
if err != nil {
log.Fatalf("Cannot publish: %s", err)
}
// Create channel to receive message when main process should be stopped
completeChan := make(chan bool)
// Initialize new instance of gonodeSrv structure which implements Process behaviour
eSrv := new(gonodeSrv)
// Spawn process with one arguments
enode.Spawn(eSrv, completeChan)
// RPC
// Create closure
eClos := func(terms etf.List) (r etf.Term) {
r = etf.Term(etf.Tuple{etf.Atom("gonode"), etf.Atom("reply"), len(terms)})
return
}
// Provide it to call via RPC with `rpc:call([email protected], go_rpc, call, [as, qwe])`
err = enode.RpcProvide("go_rpc", "call", eClos)
if err != nil {
log.Printf("Cannot provide function to RPC: %s", err)
}
// Wait to stop
<-completeChan
return
}
示例12: HandleCall
func (nk *netKernel) HandleCall(message *etf.Term, from *etf.Tuple) (reply *etf.Term) {
nLog("NET_KERNEL: HandleCall: %#v, From: %#v", *message, *from)
switch t := (*message).(type) {
case etf.Tuple:
if len(t) == 2 {
switch tag := t[0].(type) {
case etf.Atom:
if string(tag) == "is_auth" {
nLog("NET_KERNEL: is_auth: %#v", t[1])
replyTerm := etf.Term(etf.Atom("yes"))
reply = &replyTerm
}
}
}
}
return
}
示例13: rpcCreateFS
// rpc funcs for erlang nodes
// args must be in form `[Name:string]`
// returns either `ok` or `{error, Reason}`
func (r *Relay) rpcCreateFS(terms etf.List) etf.Term {
if len(terms) != 1 {
return etf.Term(etf.Tuple{etf.Atom("error"), etf.Atom("badarith")})
}
t := terms[0]
if _, ok := t.(string); !ok {
return etf.Term(etf.Tuple{etf.Atom("error"), etf.Atom("badarg")})
}
name := t.(string)
err := r.createFS(name)
if err != nil {
println("cannot create fs: ", err)
return etf.Term(etf.Tuple{etf.Atom("error"), etf.Atom("failed-to-create-fs")})
}
return etf.Term(etf.Atom("ok"))
}
示例14: runNode
func runNode() (enode *node.Node) {
enode = node.NewNode(nodeName, nodeCookie)
err := enode.Publish(nodePort)
if err != nil {
log.Printf("Cannot publish: %s", err)
enode = nil
}
eSrv := new(eclusSrv)
enode.Spawn(eSrv)
eClos := func(terms etf.List) (r etf.Term) {
r = etf.Term(etf.Tuple{etf.Atom("enode"), len(terms)})
return
}
err = enode.RpcProvide("enode", "lambda", eClos)
if err != nil {
log.Printf("Cannot provide function to RPC: %s", err)
}
return
}
示例15: HandleCall
// affecter data request
// msg must be atom `req`
func (d *deviceProc) HandleCall(msg *etf.Term, from *etf.Tuple) *etf.Term {
println("handling call")
if atom, ok := (*msg).(etf.Atom); !ok {
t := etf.Term(etf.Tuple{etf.Atom("error"), etf.Atom("badarg")})
return &t
} else {
if string(atom) != "req" {
t := etf.Term(etf.Tuple{etf.Atom("error"), etf.Atom("badarg")})
return &t
}
buf := d.device.Affect()
if buf == nil {
t := etf.Term(etf.Tuple{etf.Atom("ok"), etf.Atom("nil")})
return &t
} else {
t := etf.Term(etf.Tuple{etf.Atom("ok"), buf})
return &t
}
}
}