// Add adds the given dependency to the list of monitored depedencies // and start the associated view. If the dependency already exists, no action is // taken. // // If the Dependency already existed, it this function will return false. If the // view was successfully created, it will return true. If an error occurs while // creating the view, it will be returned here (but future errors returned by // the view will happen on the channel). func (w *Watcher) Add(d dep.Dependency) (bool, error) { w.Lock() defer w.Unlock() log.Printf("[DEBUG] (watcher) adding %s", d) if _, ok := w.depViewMap[d.String()]; ok { log.Printf("[TRACE] (watcher) %s already exists, skipping", d) return false, nil } // Choose the correct retry function based off of the dependency's type. var retryFunc RetryFunc switch d.Type() { case dep.TypeConsul: retryFunc = w.retryFuncConsul case dep.TypeVault: retryFunc = w.retryFuncVault default: retryFunc = w.retryFuncDefault } v, err := NewView(&NewViewInput{ Dependency: d, Clients: w.clients, MaxStale: w.maxStale, Once: w.once, RetryFunc: retryFunc, }) if err != nil { return false, errors.Wrap(err, "watcher") } log.Printf("[TRACE] (watcher) %s starting", d) w.depViewMap[d.String()] = v go v.poll(w.dataCh, w.errCh) return true, nil }