drugbank/drugs.go

92 lines
1.7 KiB
Go

package drugs
import (
"encoding/json"
"github.com/sahilm/fuzzy"
"io/ioutil"
"strings"
)
type DrugInteraction struct {
ID string
}
type PathWay struct {
ID string
Drugs []string
}
type Salt struct {
ID string
Name string
}
type DrugDatabase struct {
drugs []DrugInfo
index map[string]int
keys []string
}
type Classification struct {
Description string
DirectParent string
Kingdom string
SuperClass string
Class string
SubClass string
}
type DrugInfo struct {
ID string
Name string
DrugType string
HalfLife string
Description string
Classification Classification
Indication string
Toxicity string
MechanismOfAction string
Pharmacodynamics string
Absorption string
Interactions []DrugInteraction
Salts []Salt
Groups map[string]bool
Pathways []PathWay
}
func (dd * DrugDatabase) generateIndex() {
dd.index = make(map[string]int)
for i,drug := range dd.drugs {
dd.index[strings.ToLower(drug.ID)] = i
dd.index[strings.ToLower(drug.Name)] = i
dd.keys = append(dd.keys, strings.ToLower(drug.ID))
dd.keys = append(dd.keys, strings.ToLower(drug.Name))
}
}
func (dd * DrugDatabase) Lookup(query string) (DrugInfo) {
index,ok := dd.index[strings.ToLower(query)]
if ok {
return dd.drugs[index]
}
matches := fuzzy.Find(query, dd.keys)
for _,match := range matches {
return dd.drugs[dd.index[match.Str]]
}
return DrugInfo{}
}
func LoadDatabaseJSON(path string) DrugDatabase {
data,err := ioutil.ReadFile(path)
if err == nil {
var db []DrugInfo
err := json.Unmarshal(data, &db)
if err == nil {
var ddb DrugDatabase
ddb.drugs = db
ddb.generateIndex()
return ddb
}
}
return DrugDatabase{}
}