86 lines
2.0 KiB
Plaintext
86 lines
2.0 KiB
Plaintext
/* go run Distributed_programming_server.go */
|
|
|
|
package main
|
|
|
|
import(
|
|
wren "github.com/crazyinfin8/WrenGo"
|
|
"log"
|
|
"net"
|
|
"net/http"
|
|
"net/rpc"
|
|
)
|
|
|
|
type any = interface{}
|
|
|
|
type TaxComputer float64
|
|
|
|
var vm2 *wren.VM
|
|
|
|
var fileName = "Distributed_programming_server.wren"
|
|
var fileName2 = "Distributed_programming_server_2.wren"
|
|
|
|
func (taxRate TaxComputer) Tax(x float64, r *float64) error {
|
|
wrenVar, _ := vm2.GetVariable(fileName2, "TaxComputer")
|
|
wrenClass, _ := wrenVar.(*wren.Handle)
|
|
defer wrenClass.Free()
|
|
wrenMethod, _ := wrenClass.Func("tax(_,_)")
|
|
defer wrenMethod.Free()
|
|
ret, _ := wrenMethod.Call(x, float64(taxRate))
|
|
*r = ret.(float64)
|
|
return nil
|
|
}
|
|
|
|
func register(vm *wren.VM, parameters []any) (any, error) {
|
|
c := TaxComputer(0.05) // 5% tax rate
|
|
rpc.Register(c)
|
|
return nil, nil
|
|
}
|
|
|
|
func handleHTTP(vm *wren.VM, parameters []any) (any, error) {
|
|
rpc.HandleHTTP()
|
|
return nil, nil
|
|
}
|
|
|
|
func serve(vm *wren.VM, parameters []any) (any, error) {
|
|
handle := parameters[1].(*wren.ForeignHandle)
|
|
ifc, _ := handle.Get()
|
|
listener := ifc.(*net.Listener)
|
|
http.Serve(*listener, nil)
|
|
return nil, nil
|
|
}
|
|
|
|
func listen(vm *wren.VM, parameters []any) (any, error) {
|
|
network := parameters[1].(string)
|
|
address := parameters[2].(string)
|
|
listener, err := net.Listen(network, address)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
return &listener, nil
|
|
}
|
|
|
|
func main() {
|
|
vm := wren.NewVM()
|
|
vm2 = wren.NewVM()
|
|
vm2.InterpretFile(fileName2)
|
|
|
|
rpcMethodMap := wren.MethodMap {
|
|
"static register()": register,
|
|
"static handleHTTP()": handleHTTP,
|
|
}
|
|
|
|
httpMethodMap := wren.MethodMap { "static serve(_)":serve }
|
|
|
|
classMap := wren.ClassMap {
|
|
"Listener": wren.NewClass(listen, nil, nil),
|
|
"Rpc" : wren.NewClass(nil, nil, rpcMethodMap),
|
|
"HTTP" : wren.NewClass(nil, nil, httpMethodMap),
|
|
}
|
|
|
|
module := wren.NewModule(classMap)
|
|
vm.SetModule(fileName, module)
|
|
vm.InterpretFile(fileName)
|
|
vm.Free()
|
|
vm2.Free()
|
|
}
|