Files
obitools4/pkg/obitools/obifind/iterator.go
2024-11-14 19:10:23 +01:00

84 lines
1.6 KiB
Go

package obifind
import (
"bytes"
"fmt"
"git.metabarcoding.org/obitools/obitools4/obitools4/pkg/obitax"
)
func IFilterRankRestriction() func(*obitax.ITaxon) *obitax.ITaxon {
f := func(s *obitax.ITaxon) *obitax.ITaxon {
return s
}
if __restrict_rank__ != "" {
f = func(s *obitax.ITaxon) *obitax.ITaxon {
return s.IFilterOnTaxRank(__restrict_rank__)
}
}
return f
}
func ITaxonNameMatcher() (func(string) *obitax.ITaxon, error) {
taxonomy, err := CLILoadSelectedTaxonomy()
if err != nil {
return nil, err
}
fun := func(name string) *obitax.ITaxon {
return taxonomy.IFilterOnName(name, __fixed_pattern__)
}
return fun, nil
}
func ITaxonRestrictions() (func(*obitax.ITaxon) *obitax.ITaxon, error) {
clades, err := CLITaxonomicalRestrictions()
if err != nil {
return nil, err
}
rankfilter := IFilterRankRestriction()
fun := func(iterator *obitax.ITaxon) *obitax.ITaxon {
return rankfilter(iterator).IFilterBelongingSubclades(clades)
}
return fun, nil
}
func TaxonAsString(taxon *obitax.Taxon, pattern string) string {
text := taxon.ScientificName()
if __with_path__ {
var bf bytes.Buffer
path := taxon.Path()
bf.WriteString(path.Get(path.Len() - 1).ScientificName())
for i := path.Len() - 2; i >= 0; i-- {
fmt.Fprintf(&bf, ":%s", path.Get(i).ScientificName())
}
text = bf.String()
}
return fmt.Sprintf("%-20s | %10s | %10s | %-20s | %s",
pattern,
taxon.String(),
taxon.Parent().String(),
taxon.Rank(),
text)
}
func TaxonWriter(itaxa *obitax.ITaxon, pattern string) {
for itaxa.Next() {
fmt.Println(TaxonAsString(itaxa.Get(), pattern))
}
}