Documentation ¶
Overview ¶
Package glu support yuin/gopher-lua with easy modular definition and other enchantments. glu.Modular and gua.BaseType will inject mod.Help(name string?) method to output HelpCache information. glu.Get: Pool function to get a lua.LState. glu.Put: Pool function to return a lua.LState. glu.registry: shared module registry. glu.Auto: config for autoload modules in registry into lua.LState.
Example ¶
// fetch an instance vm := Get() err := vm.DoString(`print('hello lua')`) if err != nil { return }
Output:
Index ¶
- Variables
- func CompileChunk(code string, source string) (*FunctionProto, error)
- func ExecuteChunk(code *FunctionProto, argN, retN int, before Operator, after Operator) (err error)
- func ExecuteCode(code string, argsN, retN int, before Operator, after Operator) error
- func Failed(err error)
- func MakePool()
- func Pack(v interface{}, s *LState) LValue
- func Put(s *Vm)
- func Raw(v LValue) interface{}
- func Recover(act func()) (err error)
- func RecoverErr(act func() error) (err error)
- func Register(m ...Modular) (err error)
- func SafeFunc(fn func(state *LState) int) LGFunction
- func SafeOpt(s *LState, at int, t LValueType) interface{}
- func SafeParam(s *LState, start int, types ...LValueType) (r []interface{})
- func Success(err error)
- func TableToMap(s *LTable) (r map[LValue]LValue)
- func TableToSlice(s *LTable) (r []LValue)
- func TableUnpack(s *LTable, noLua bool, history map[LValue]interface{}) (r map[interface{}]interface{}, keys []interface{})
- type BaseType
- func (m *BaseType) AddField(name string, help string, value LValue) Type
- func (m *BaseType) AddFunc(name string, help string, fn LGFunction) Type
- func (m *BaseType) AddMethod(name string, help string, value LGFunction) Type
- func (m *BaseType) AddMethodCast(name string, help string, act func(s *LState, data interface{}) int) Type
- func (m *BaseType) AddMethodUserData(name string, help string, act func(s *LState, data *LUserData) int) Type
- func (m *BaseType) AddModule(mod Modular) Type
- func (m BaseType) CanCast() bool
- func (m BaseType) Cast(u *LUserData) interface{}
- func (m BaseType) CastVar(s *LState, n int) interface{}
- func (m BaseType) New(l *LState, val interface{}) int
- func (m BaseType) NewValue(l *LState, val interface{}) *LUserData
- func (m *BaseType) Override(op Operate, help string, fn LGFunction) Type
- func (m *BaseType) OverrideCast(op Operate, help string, act func(s *LState, data interface{}) int) Type
- func (m *BaseType) OverrideUserData(op Operate, help string, act func(s *LState, data *LUserData) int) Type
- func (m *BaseType) PreLoad(l *LState)
- func (m *BaseType) PreloadSubModule(l *LState, t *LTable)
- func (m *BaseType) SafeFun(name string, help string, fn LGFunction) Type
- func (m *BaseType) SafeMethod(name string, help string, value LGFunction) Type
- func (m *BaseType) SafeOverride(op Operate, help string, fn LGFunction) Type
- func (m *BaseType) Type() reflect.Type
- type Chunk
- type Mod
- func (m *Mod) AddField(name string, help string, value LValue) Module
- func (m *Mod) AddFunc(name string, help string, fn LGFunction) Module
- func (m *Mod) AddModule(mod Modular) Module
- func (m *Mod) GetHelp() string
- func (m *Mod) GetName() string
- func (m *Mod) PreLoad(l *LState)
- func (m *Mod) PreloadSubModule(l *LState, t *LTable)
- func (m *Mod) SafeFun(name string, help string, fn LGFunction) Module
- func (m *Mod) TopLevel() bool
- type Modular
- type Module
- type Operate
- type Operator
- type Type
- type Vm
- func (s *Vm) OpenLibsWithout(names ...string) *Vm
- func (s *Vm) Polluted() (r bool)
- func (s *Vm) Reset() (r *Vm)
- func (s *Vm) Snapshot() *Vm
- func (s *Vm) TabChildEqualTo(t1 *LTable, t2 *LTable, keys ...string) (r bool)
- func (s *Vm) TabCopyChildNew(f *LTable, keys ...string) *LTable
- func (s *Vm) TabCopyNew(f *LTable) *LTable
- func (s *Vm) TabEqualTo(t1 *LTable, t2 *LTable) (r bool)
- type VmPool
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( //HelpKey the module HelpCache key HelpKey = "?" //HelpFunc the help function name HelpFunc = "help" //HelpPrompt the prompt for no value supply for HelpCache HelpPrompt = "show HelpCache with those key word: " HelpChunk = `chunk(code,name string)(Chunk?,string?) ==> pre compile string into bytecode` HelpHelp = HelpFunc + `(topic string?)string? => fetch HelpCache of topic,'?' show topics,without topic show loadable modules` HelpTopic = `?,chunk` EagerHelpPrepare = false )
var ( ErrAlreadyExists = errors.New("element already exists") ErrIndexOverrideWithMethods = errors.New("element both have methods and index overrides") ErrIsTop = errors.New("element is top module") )
var ( //Option LState configuration Option = Options{} InitialSize = 4 )
var ( //OpNone operator do nothing, better to use nil OpNone = func(s *Vm) error { return nil } //OpPush operator to push N value OpPush = func(n ...LValue) Operator { return func(s *Vm) error { for _, value := range n { s.Push(value) } return nil } } //OpPushUserData operator to push N UserDate OpPushUserData = func(n ...interface{}) Operator { return func(s *Vm) error { for _, i := range n { ud := s.NewUserData() ud.Value = i s.Push(ud) } return nil } } //OpSafe operator to wrap as none error will happen OpSafe = func(fn func(s *Vm)) Operator { return func(s *Vm) error { fn(s) return nil } } //OpPop operator to pop and consume N value from start,then pop to n OpPop = func(fn func(value ...LValue), start, count int) Operator { if start < 0 || count <= 0 { panic("start must greater than 0 and count must greater than 0") } t := start + count return func(s *Vm) error { v := make([]LValue, 0, count) for i := start; i < t; i++ { v = append(v, s.Get(i)) } s.Pop(t - 1) fn(v...) return nil } } //OpPopN operator to pop n value (Reset stack) OpPopN = func(count int) Operator { if count < 1 { panic("count must greater than 0") } return func(s *Vm) error { s.Pop(count) return nil } } )
var ( //Auto if true, will autoload modules in registry Auto = true )
var ( //BaseMod the global module BaseMod = glu(map[string]string{}) )
var ( //ErrorSupress not raise error ,use for SafeFunc ErrorSupress = errors.New("") )
var (
// ExistNode is placeholder for a map set
ExistNode = struct{}{}
)
Functions ¶
func CompileChunk ¶
CompileChunk compile code to FunctionProto
func ExecuteChunk ¶
ExecuteChunk execute pre complied FunctionProto
func ExecuteCode ¶
ExecuteCode run code in LState, use before to push args, after to extract return value
func MakePool ¶
func MakePool()
MakePool manual create statePool , when need to change Option, should invoke once before use Get and Put
func Pack ¶ added in v0.1.13
func Pack(v interface{}, s *LState) LValue
Pack any to LValue.
1. nil, bool, numbers and other Lua value packed as normal LValue
2. array, slice,map[string]any packed into LTable (the elements also packed)
3. others are packed into LUserData
func Raw ¶ added in v0.1.10
func Raw(v LValue) interface{}
Raw extract raw LValue: nil bool float64 string *LUserData *LState *LTable *LChannel
func RecoverErr ¶
RecoverErr warp an error supplier func with recover
func SafeFunc ¶ added in v0.1.10
func SafeFunc(fn func(state *LState) int) LGFunction
SafeFunc no panic func
func SafeOpt ¶ added in v0.1.13
func SafeOpt(s *LState, at int, t LValueType) interface{}
SafeOpt opt param with SafeFunc
func SafeParam ¶ added in v0.1.10
func SafeParam(s *LState, start int, types ...LValueType) (r []interface{})
SafeParam extra parameter must match type or panic,use with SafeFunc.
func TableToMap ¶
func TableToMap(s *LTable) (r map[LValue]LValue)
TableToMap convert LTable to a Map with all key values
func TableToSlice ¶
func TableToSlice(s *LTable) (r []LValue)
TableToSlice convert LTable to a Slice with all Number index values
func TableUnpack ¶
func TableUnpack(s *LTable, noLua bool, history map[LValue]interface{}) (r map[interface{}]interface{}, keys []interface{})
TableUnpack convert LTable to a Map with all key values
All keys and values may be:
LTNumber: float64
LTBool: bool
LTTable: map[any]any
LTString: string
(those type will not output with noLua=true )
LTFunction: *LFunction
LTUserData: *LUserData
LChannel: LChannel
Types ¶
type BaseType ¶
BaseType define a LTable with MetaTable, which mimicry class like action in Lua
func NewSimpleType ¶
NewSimpleType create new BaseType without ctor
func NewType ¶
func NewType(name string, help string, top bool, ctorHelp string, ctor func(*LState) interface{}) *BaseType
NewType create new BaseType
func NewTypeCast ¶
func NewTypeCast(sample interface{}, name string, help string, top bool, ctorHelp string, ctor func(*LState) interface{}) *BaseType
NewTypeCast create new BaseType with reflect Signature
func (*BaseType) AddField ¶
AddField add value field to this Modular
@name the field name
@HelpCache HelpCache string, if empty will not generate into HelpCache
@value the field value
func (*BaseType) AddFunc ¶
AddFunc add function to this Modular
@name function name, must match lua limitation
@HelpCache HelpCache string, if empty will not generate into HelpCache
@fn the LGFunction
func (*BaseType) AddMethodCast ¶
func (m *BaseType) AddMethodCast(name string, help string, act func(s *LState, data interface{}) int) Type
AddMethodCast prechecked type (only create with NewTypeCast).
func (*BaseType) AddMethodUserData ¶
func (m *BaseType) AddMethodUserData(name string, help string, act func(s *LState, data *LUserData) int) Type
AddMethodUserData add method to this type which means instance method, with auto extract first argument.
func (*BaseType) AddModule ¶
AddModule add sub-module to this Modular
@mod the Mod **Note** must with TopLevel false.
func (BaseType) Cast ¶
func (m BaseType) Cast(u *LUserData) interface{}
Cast nil if not current type else the value
func (BaseType) NewValue ¶
func (m BaseType) NewValue(l *LState, val interface{}) *LUserData
NewValue create new LValue
func (*BaseType) OverrideCast ¶
func (m *BaseType) OverrideCast(op Operate, help string, act func(s *LState, data interface{}) int) Type
OverrideCast see Override and AddMethodCast
func (*BaseType) OverrideUserData ¶
func (m *BaseType) OverrideUserData(op Operate, help string, act func(s *LState, data *LUserData) int) Type
OverrideUserData see Override and AddMethodUserData
func (*BaseType) PreloadSubModule ¶
func (m *BaseType) PreloadSubModule(l *LState, t *LTable)
func (*BaseType) SafeMethod ¶ added in v0.1.11
SafeMethod warp with SafeFunc
func (*BaseType) SafeOverride ¶ added in v0.1.11
SafeOverride wrap with SafeFunc
type Mod ¶
type Mod struct { Name string //Name of Modular Top bool //is top level Help string //Help information of this Modular Submodules []Modular //registered sub modules HelpCache map[string]string //exported helps for better use // contains filtered or unexported fields }
Mod define a Mod only contains Functions and value fields,maybe with Submodules
func (*Mod) AddField ¶
AddField add value field to this Modular
@name the field name
@HelpCache HelpCache string, if empty will not generate into HelpCache
@value the field value
func (*Mod) AddFunc ¶
AddFunc add function to this Modular
@name function name, must match lua limitation
@HelpCache HelpCache string, if empty will not generate into HelpCache
@fn the LGFunction
func (*Mod) AddModule ¶
AddModule add sub-module to this Modular
@mod the Mod **Note** must with TopLevel false.
func (*Mod) PreloadSubModule ¶
func (m *Mod) PreloadSubModule(l *LState, t *LTable)
type Modular ¶
type Modular interface { //TopLevel dose this Mod is top level,means should not be submodule TopLevel() bool //PreLoad load as global Mod PreLoad(l *lua.LState) //PreloadSubModule use for submodule loading, Should NOT invoke manually PreloadSubModule(l *lua.LState, t *lua.LTable) //GetName the unique name (if is a Top Level Modular) GetName() string //GetHelp Modular HelpCache info GetHelp() string }
Modular shared methods make it a Modular
type Module ¶
type Module interface { Modular // AddFunc add function to this Module // // @name function name, must match lua limitation // // @HelpCache HelpCache string, if empty will generate just Module.Function as HelpCache // // @fn the LGFunction AddFunc(name string, help string, fn LGFunction) Module //SafeFun warp with SafeFunc,see AddFunc for detail SafeFun(name string, help string, value LGFunction) Module // AddField add value field to this Module (static value) AddField(name string, help string, value LValue) Module // AddModule add submodule to this Module // // @mod the Mod , requires Mod.TopLevel is false. AddModule(mod Modular) Module }
type Operate ¶
type Operate int
const ( OPERATE_INVALID Operate = iota OPERATE_ADD // + OPERATE_SUB // - OPERATE_MUL // * OPERATE_DIV // / OPERATE_UNM // - OPERATE_MOD // % OPERATE_POW // ^ OPERATE_CONCAT // .. OPERATE_EQ // == OPERATE_LT // < OPERATE_LE // <= OPERATE_LEN // # OPERATE_INDEX // [] OPERATE_NEWINDEX // []= OPERATE_TO_STRING // tostring OPERATE_CALL // () )
noinspection GoSnakeCaseUsage,GoUnusedConst
type Type ¶
type Type interface { Modular // Type the real go type Type() reflect.Type // New create new instance New(l *LState, val interface{}) int // NewValue create new LValue NewValue(l *LState, val interface{}) *LUserData // CanCast check the type can use cast (when construct with NewTypeCast) CanCast() bool // CastVar cast value on stack (already have error processed) CastVar(s *LState, n int) interface{} // Cast nil if not current type else the value Cast(u *LUserData) interface{} // AddFunc static function AddFunc(name string, help string, fn LGFunction) Type //SafeFun warp with SafeFunc SafeFun(name string, help string, value LGFunction) Type // AddField static field AddField(name string, help string, value LValue) Type //SafeMethod warp with SafeFunc SafeMethod(name string, help string, value LGFunction) Type // AddMethod add method to this type which means instance method. AddMethod(name string, help string, value LGFunction) Type // AddMethodUserData add method to this type which means instance method, with auto extract first argument. AddMethodUserData(name string, help string, act func(s *LState, u *LUserData) int) Type // AddMethodCast prechecked type (only create with NewTypeCast). AddMethodCast(name string, help string, act func(s *LState, i interface{}) int) Type // Override operators an operator Override(op Operate, help string, fn LGFunction) Type //SafeOverride warp with SafeFunc SafeOverride(op Operate, help string, value LGFunction) Type // OverrideUserData see Override and AddMethodUserData OverrideUserData(op Operate, help string, act func(s *LState, u *LUserData) int) Type // OverrideCast see Override and AddMethodCast OverrideCast(op Operate, help string, act func(s *LState, i interface{}) int) Type }
type Vm ¶
type Vm struct { *LState // contains filtered or unexported fields }
Vm take Env Snapshot to protect from Global pollution
func (*Vm) OpenLibsWithout ¶
OpenLibsWithout open gopher-lua libs but filter some by name @fluent
func (*Vm) TabChildEqualTo ¶
func (*Vm) TabCopyChildNew ¶
func (*Vm) TabCopyNew ¶
func (s *Vm) TabCopyNew(f *LTable) *LTable
func (*Vm) TabEqualTo ¶
type VmPool ¶
type VmPool struct {
// contains filtered or unexported fields
}
VmPool threadsafe LState Pool
func CreatePool ¶
func CreatePool() *VmPool
func CreatePoolWith ¶
func CreatePoolWith(ctor func() *LState) *VmPool
CreatePoolWith create pool with user defined constructor
BaseMod will auto registered