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{} }