swappableMux is now public and Append() now updates Server.Handler

Co-authored-by: Roberto Abdelkader Martínez Pérez <robertomartinezp@gmail.com>
This commit is contained in:
pancho horrillo
2019-10-10 20:06:05 +02:00
parent 0c408497a3
commit df5d38e94f
8 changed files with 74 additions and 42 deletions
+64
View File
@@ -0,0 +1,64 @@
package user
import (
"errors"
"sync"
"github.com/BBVA/kapow/internal/server/model"
"github.com/BBVA/kapow/internal/server/user/mux"
)
type safeRouteList struct {
rs []model.Route
m *sync.RWMutex
}
var Routes safeRouteList = New()
func New() safeRouteList {
return safeRouteList{
rs: []model.Route{},
m: &sync.RWMutex{},
}
}
func (srl *safeRouteList) Append(r model.Route) model.Route {
srl.m.Lock()
srl.rs = append(srl.rs, r)
l := len(srl.rs)
srl.m.Unlock()
Server.Handler.(*mux.SwappableMux).Update(srl.Snapshot())
return model.Route{Index: l - 1}
}
func (srl *safeRouteList) Snapshot() []model.Route {
srl.m.RLock()
defer srl.m.RUnlock()
rs := make([]model.Route, len(srl.rs))
copy(rs, srl.rs)
return rs
}
func (srl *safeRouteList) List() []model.Route {
rs := srl.Snapshot()
for i := 0; i < len(rs); i++ {
rs[i].Index = i
}
return rs
}
func (srl *safeRouteList) Delete(ID string) error {
srl.m.Lock()
defer srl.m.Unlock()
for i := 0; i < len(srl.rs); i++ {
if srl.rs[i].ID == ID {
srl.rs = append(srl.rs[:i], srl.rs[i+1:]...)
return nil
}
}
return errors.New("Route not found")
}