mirror of
https://github.com/metabarcoding/obitools4.git
synced 2025-12-10 01:30:27 +00:00
Changes to be committed:
modified: go.mod modified: go.sum modified: pkg/obilua/obilib.go modified: pkg/obilua/obiseq.go modified: pkg/obilua/obiseqslice.go new file: pkg/obilua/obitaxon.go new file: pkg/obilua/obitaxonomy.go modified: pkg/obioptions/version.go
This commit is contained in:
110
pkg/obilua/obitaxonomy.go
Normal file
110
pkg/obilua/obitaxonomy.go
Normal file
@@ -0,0 +1,110 @@
|
||||
package obilua
|
||||
|
||||
import (
|
||||
"git.metabarcoding.org/obitools/obitools4/obitools4/pkg/obitax"
|
||||
"git.metabarcoding.org/obitools/obitools4/obitools4/pkg/obiutils"
|
||||
lua "github.com/yuin/gopher-lua"
|
||||
)
|
||||
|
||||
func RegisterObiTaxonomy(luaState *lua.LState) {
|
||||
registerTaxonomyType(luaState)
|
||||
registerTaxonType(luaState)
|
||||
}
|
||||
|
||||
const luaTaxonomyTypeName = "Taxonomy"
|
||||
|
||||
func registerTaxonomyType(luaState *lua.LState) {
|
||||
taxonomyType := luaState.NewTypeMetatable(luaTaxonomyTypeName)
|
||||
luaState.SetGlobal(luaTaxonomyTypeName, taxonomyType)
|
||||
luaState.SetField(taxonomyType, "new", luaState.NewFunction(newTaxonomy))
|
||||
luaState.SetField(taxonomyType, "default", luaState.NewFunction(defaultTaxonomy))
|
||||
luaState.SetField(taxonomyType, "has_default", luaState.NewFunction(hasDefaultTaxonomy))
|
||||
luaState.SetField(taxonomyType, "nil", taxon2Lua(luaState, nil))
|
||||
luaState.SetField(taxonomyType, "__index",
|
||||
luaState.SetFuncs(luaState.NewTable(),
|
||||
taxonomyMethods))
|
||||
}
|
||||
|
||||
func taxonomy2Lua(interpreter *lua.LState,
|
||||
taxonomy *obitax.Taxonomy) lua.LValue {
|
||||
ud := interpreter.NewUserData()
|
||||
ud.Value = taxonomy
|
||||
interpreter.SetMetatable(ud, interpreter.GetTypeMetatable(luaTaxonomyTypeName))
|
||||
|
||||
return ud
|
||||
}
|
||||
|
||||
func newTaxonomy(luaState *lua.LState) int {
|
||||
name := luaState.CheckString(1)
|
||||
code := luaState.CheckString(2)
|
||||
|
||||
charset := obiutils.AsciiAlphaNumSet
|
||||
if luaState.GetTop() > 2 {
|
||||
charset = obiutils.AsciiSetFromString(luaState.CheckString(3))
|
||||
}
|
||||
|
||||
taxonomy := obitax.NewTaxonomy(name, code, charset)
|
||||
|
||||
luaState.Push(taxonomy2Lua(luaState, taxonomy))
|
||||
return 1
|
||||
}
|
||||
|
||||
func defaultTaxonomy(luaState *lua.LState) int {
|
||||
taxonomy := obitax.DefaultTaxonomy()
|
||||
|
||||
if taxonomy == nil {
|
||||
luaState.RaiseError("No default taxonomy")
|
||||
return 0
|
||||
}
|
||||
|
||||
luaState.Push(taxonomy2Lua(luaState, taxonomy))
|
||||
return 1
|
||||
}
|
||||
|
||||
func hasDefaultTaxonomy(luaState *lua.LState) int {
|
||||
taxonomy := obitax.DefaultTaxonomy()
|
||||
|
||||
luaState.Push(lua.LBool(taxonomy != nil))
|
||||
return 1
|
||||
}
|
||||
|
||||
var taxonomyMethods = map[string]lua.LGFunction{
|
||||
"name": taxonomyGetName,
|
||||
"code": taxonomyGetCode,
|
||||
"taxon": taxonomyGetTaxon,
|
||||
}
|
||||
|
||||
func checkTaxonomy(L *lua.LState) *obitax.Taxonomy {
|
||||
ud := L.CheckUserData(1)
|
||||
if v, ok := ud.Value.(*obitax.Taxonomy); ok {
|
||||
return v
|
||||
}
|
||||
L.ArgError(1, "obitax.Taxonomy expected")
|
||||
return nil
|
||||
}
|
||||
|
||||
func taxonomyGetName(luaState *lua.LState) int {
|
||||
taxo := checkTaxonomy(luaState)
|
||||
luaState.Push(lua.LString(taxo.Name()))
|
||||
return 1
|
||||
}
|
||||
|
||||
func taxonomyGetCode(luaState *lua.LState) int {
|
||||
taxo := checkTaxonomy(luaState)
|
||||
luaState.Push(lua.LString(taxo.Code()))
|
||||
return 1
|
||||
}
|
||||
|
||||
func taxonomyGetTaxon(luaState *lua.LState) int {
|
||||
taxo := checkTaxonomy(luaState)
|
||||
taxid := luaState.CheckString(2)
|
||||
taxon, err := taxo.Taxon(taxid)
|
||||
|
||||
if err != nil {
|
||||
luaState.RaiseError("%s : Error on taxon taxon: %v", taxid, err)
|
||||
return 0
|
||||
}
|
||||
|
||||
luaState.Push(taxon2Lua(luaState, taxon))
|
||||
return 1
|
||||
}
|
||||
Reference in New Issue
Block a user