mirror of
https://github.com/metabarcoding/obitools4.git
synced 2025-12-08 16:50:27 +00:00
Add a basic managment of obisequenceslice to obiscript
Former-commit-id: c3d2888ebbfb237826630548b839ce93cdbf86eb
This commit is contained in:
107
pkg/obilua/obiseqslice.go
Normal file
107
pkg/obilua/obiseqslice.go
Normal file
@@ -0,0 +1,107 @@
|
||||
package obilua
|
||||
|
||||
import (
|
||||
"git.metabarcoding.org/obitools/obitools4/obitools4/pkg/obiseq"
|
||||
lua "github.com/yuin/gopher-lua"
|
||||
)
|
||||
|
||||
const luaBioSequenceSliceTypeName = "BioSequenceSlice"
|
||||
|
||||
func registerBioSequenceSliceType(luaState *lua.LState) {
|
||||
bioSequenceSliceType := luaState.NewTypeMetatable(luaBioSequenceSliceTypeName)
|
||||
luaState.SetGlobal(luaBioSequenceSliceTypeName, bioSequenceSliceType)
|
||||
luaState.SetField(bioSequenceSliceType, "new", luaState.NewFunction(newObiSeqSlice))
|
||||
|
||||
luaState.SetField(bioSequenceSliceType, "__index",
|
||||
luaState.SetFuncs(luaState.NewTable(),
|
||||
bioSequenceSliceMethods))
|
||||
}
|
||||
|
||||
func obiseqslice2Lua(interpreter *lua.LState,
|
||||
seqslice *obiseq.BioSequenceSlice) lua.LValue {
|
||||
ud := interpreter.NewUserData()
|
||||
ud.Value = seqslice
|
||||
interpreter.SetMetatable(ud, interpreter.GetTypeMetatable(luaBioSequenceSliceTypeName))
|
||||
|
||||
return ud
|
||||
}
|
||||
|
||||
func newObiSeqSlice(luaState *lua.LState) int {
|
||||
seqslice := obiseq.NewBioSequenceSlice()
|
||||
luaState.Push(obiseqslice2Lua(luaState, seqslice))
|
||||
return 1
|
||||
}
|
||||
|
||||
var bioSequenceSliceMethods = map[string]lua.LGFunction{
|
||||
"push": bioSequenceSlicePush,
|
||||
"pop": bioSequenceSlicePop,
|
||||
"sequence": bioSequenceSliceGetSetSequence,
|
||||
"len": bioSequenceSliceGetLength,
|
||||
}
|
||||
|
||||
func checkBioSequenceSlice(L *lua.LState) *obiseq.BioSequenceSlice {
|
||||
ud := L.CheckUserData(1)
|
||||
if v, ok := ud.Value.(*obiseq.BioSequenceSlice); ok {
|
||||
return v
|
||||
}
|
||||
L.ArgError(1, "obiseq.BioSequenceSlice expected")
|
||||
return nil
|
||||
}
|
||||
|
||||
func bioSequenceSliceGetLength(luaState *lua.LState) int {
|
||||
s := checkBioSequenceSlice(luaState)
|
||||
luaState.Push(lua.LNumber(s.Len()))
|
||||
return 1
|
||||
}
|
||||
|
||||
func bioSequenceSliceGetSetSequence(luaState *lua.LState) int {
|
||||
s := checkBioSequenceSlice(luaState)
|
||||
index := luaState.CheckInt(2)
|
||||
|
||||
if index > s.Len() || index < 0 {
|
||||
luaState.RaiseError("BioSequenceSlice index out of range")
|
||||
return 0
|
||||
}
|
||||
|
||||
if luaState.GetTop() == 3 {
|
||||
ud := luaState.CheckUserData(3)
|
||||
if v, ok := ud.Value.(*obiseq.BioSequence); ok {
|
||||
(*s)[index] = v
|
||||
return 0
|
||||
}
|
||||
luaState.ArgError(1, "obiseq.BioSequenceSlice expected")
|
||||
return 0
|
||||
}
|
||||
|
||||
value := obiseq2Lua(luaState, (*s)[index])
|
||||
luaState.Push(value)
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
func bioSequenceSlicePush(luaState *lua.LState) int {
|
||||
s := checkBioSequenceSlice(luaState)
|
||||
|
||||
ud := luaState.CheckUserData(2)
|
||||
if v, ok := ud.Value.(*obiseq.BioSequence); ok {
|
||||
(*s) = append((*s), v)
|
||||
return 0
|
||||
}
|
||||
|
||||
luaState.ArgError(1, "obiseq.BioSequenceSlice expected")
|
||||
return 0
|
||||
}
|
||||
|
||||
func bioSequenceSlicePop(luaState *lua.LState) int {
|
||||
s := checkBioSequenceSlice(luaState)
|
||||
if len(*s) == 0 {
|
||||
return 0
|
||||
}
|
||||
|
||||
seq := (*s)[len(*s)-1]
|
||||
(*s) = (*s)[0 : len(*s)-1]
|
||||
value := obiseq2Lua(luaState, seq)
|
||||
luaState.Push(value)
|
||||
return 1
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user