func leadershipSettingsAccessorFactory( st *state.State, resources *common.Resources, auth common.Authorizer, ) *leadershipapiserver.LeadershipSettingsAccessor { registerWatcher := func(serviceId string) (string, error) { settingsWatcher := st.WatchLeadershipSettings(serviceId) if _, ok := <-settingsWatcher.Changes(); ok { return resources.Register(settingsWatcher), nil } return "", watcher.EnsureErr(settingsWatcher) } // TODO(katco-): <2015-01-21 Wed> // Due to time constraints, we're translating between // map[string]interface{} and map[string]string. At some point we // should support a native read of this format straight from // state. getSettings := func(serviceId string) (map[string]string, error) { settings, err := st.ReadLeadershipSettings(serviceId) if err != nil { return nil, err } // Perform the conversion rawMap := settings.Map() leadershipSettings := make(map[string]string) for k, v := range rawMap { leadershipSettings[k] = v.(string) } return leadershipSettings, nil } writeSettings := func(serviceId string, settings map[string]string) error { currentSettings, err := st.ReadLeadershipSettings(serviceId) if err != nil { return err } rawSettings := make(map[string]interface{}) for k, v := range settings { rawSettings[k] = v } currentSettings.Update(rawSettings) _, err = currentSettings.Write() return errors.Annotate(err, "could not write changes") } ldrMgr := leadership.NewLeadershipManager(lease.Manager()) return leadershipapiserver.NewLeadershipSettingsAccessor( auth, registerWatcher, getSettings, writeSettings, ldrMgr.Leader, ) }