Binder: High Level Go to Lua Binder

Binder

High level go to Lua binder. Write less, do more.

Package binder allows to easily bind to Lua. Based on gopher-lua.

Killer-feature

You can display detailed information about the error and get something like this:

Error

See _example/04-highlight-errors. And read more about it.

Installation

$ go get -u github.com/alexeyco/binder

To run unit tests:

$ cd $GOPATH/src/github.com/alexeyco/binder
$ go test -cover

To see why you need to bind go to lua (need few minutes):

$ cd $GOPATH/src/github.com/alexeyco/binder
$ go test -bench=.

Examples

Functions

package main

import (
    "errors"
    "log"

    "github.com/alexeyco/binder"
)

func main() {
    b := binder.New(binder.Options{
        SkipOpenLibs: true,
    })

    b.Func("log", func(c *binder.Context) error {
        t := c.Top()
        if t == 0 {
            return errors.New("need arguments")
        }

        l := []interface{}{}

        for i := 1; i <= t; i++ {
            l = append(l, c.Arg(i).Any())
        }

        log.Println(l...)
        return nil
    })

    if err := b.DoString(`
        log('This', 'is', 'Lua')
    `); err != nil {
        log.Fatalln(err)
    }
}

Modules

package main

import (
    "errors"
    "log"

    "github.com/alexeyco/binder"
)

func main() {
    b := binder.New()

    m := b.Module("reverse")
    m.Func("string", func(c *binder.Context) error {
        if c.Top() == 0 {
            return errors.New("need arguments")
        }

        s := c.Arg(1).String()

        runes := []rune(s)
        for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
            runes[i], runes[j] = runes[j], runes[i]
        }

        c.Push().String(string(runes))
        return nil
    })

    if err := b.DoString(`
        local r = require('reverse')

        print(r.string('ABCDEFGHIJKLMNOPQRSTUFVWXYZ'))
    `); err != nil {
        log.Fatalln(err)
    }
}

Tables

package main

import (
    "errors"
    "log"

    "github.com/alexeyco/binder"
)

type Person struct {
    Name string
}

func main() {
    b := binder.New()

    t := b.Table("person")
    t.Static("new", func(c *binder.Context) error {
        if c.Top() == 0 {
            return errors.New("need arguments")
        }
        n := c.Arg(1).String()

        c.Push().Data(&Person{n}, "person")
        return nil
    })

    t.Dynamic("name", func(c *binder.Context) error {
        p, ok := c.Arg(1).Data().(*Person)
        if !ok {
            return errors.New("person expected")
        }

        if c.Top() == 1 {
            c.Push().String(p.Name)
        } else {
            p.Name = c.Arg(2).String()
        }

        return nil
    })

    if err := b.DoString(`
        local p = person.new('Steeve')
        print(p:name())

        p:name('Alice')
        print(p:name())
    `); err != nil {
        log.Fatalln(err)
    }
}

Options

// Options binder options object
type Options struct {
    // CallStackSize is call stack size
    CallStackSize int
    // RegistrySize is data stack size
    RegistrySize int
    // SkipOpenLibs controls whether or not libraries are opened by default
    SkipOpenLibs bool
    // IncludeGoStackTrace tells whether a Go stacktrace should be included in a Lua stacktrace when panics occur.
    IncludeGoStackTrace bool
}

Read more.

For example:

b := binder.New(binder.Options{
    SkipOpenLibs: true,
})

Killer-featured errors

package main

import (
    "errors"
    "log"
    "os"

    "github.com/alexeyco/binder"
)

type Person struct {
    Name string
}

func main() {
    b := binder.New()
    
    // ...

    if err := b.DoString(`-- some string`); err != nil {
        switch err.(type) {
        case *binder.Error:
            e := err.(*binder.Error)
            e.Print()

            os.Exit(0)
            break
        default:
            log.Fatalln(err)
        }
    }
}

Note: if SkipOpenLibs is true, not all open libs will be skipped in contrast to the basic logic of gopher-lua. If you set SkipOpenLibs to true, the following basic libraries will be loaded: all basic functions, table and package.


Download Details:

Author: alexeyco
Source Code: https://github.com/alexeyco/binder 
License: MIT license

#go #golang #lua 

Binder: High Level Go to Lua Binder
1.50 GEEK