// Bag will fetch a random line from file and return it. // args[0] - filename. func Bag(scope common.Scope, args ...interface{}) interface{} { var err error filename := args[0].(string) if !filepath.IsAbs(filename) { if bagdir, _, ok := scope.GetString("_bagdir"); ok { filename = filepath.Join(bagdir, filename) } else if prodfile, _, ok := scope.GetString("_prodfile"); ok { dirpath := filepath.Dir(prodfile) filename = filepath.Join(dirpath, filename) } } if filename, err = filepath.Abs(filename); err != nil { panic(fmt.Errorf("bad filepath: %v\n", filename)) } bagrw.RLock() records, ok := cacheBagRecords[filename] bagrw.RUnlock() if !ok { records = readBag(filename) bagrw.Lock() cacheBagRecords[filename] = records bagrw.Unlock() } if len(records) > 0 { rnd := scope.GetRandom() record := records[rnd.Intn(len(records))] if len(record) > 0 { return record[0] } } return "" }