// New returns a new Tailer, configured with the supplied Options func New(o Options) (*Tailer, error) { if o.Lines == nil { return nil, errors.New("tailer needs lines") } fs := o.FS if fs == nil { fs = &afero.OsFs{} } w := o.W if w == nil { var err error w, err = watcher.NewLogWatcher() if err != nil { return nil, fmt.Errorf("Couldn't create a watcher for tailer: %s", err) } } t := &Tailer{ w: w, watched: make(map[string]struct{}), lines: o.Lines, files: make(map[string]afero.File), partials: make(map[string]string), fs: fs, } go t.run() return t, nil }
// NewLoader creates a new program loader. It takes a filesystem watcher // and a filesystem interface as arguments. If fs is nil, it will use the // default filesystem interface. func NewLoader(o LoaderOptions) (*Loader, error) { if o.Store == nil || o.Lines == nil { return nil, errors.New("loader needs a store and lines") } fs := o.FS if fs == nil { fs = &afero.OsFs{} } w := o.W if w == nil { var err error w, err = watcher.NewLogWatcher() if err != nil { return nil, fmt.Errorf("Couldn't create a watcher for loader: %s", err) } } l := &Loader{ w: w, ms: o.Store, fs: fs, handles: make(map[string]*vmHandle), watcherDone: make(chan struct{}), VMsDone: make(chan struct{}), compileOnly: o.CompileOnly, dumpBytecode: o.DumpBytecode, syslogUseCurrentYear: o.SyslogUseCurrentYear} go l.processEvents() go l.processLines(o.Lines) return l, nil }