package khatru import ( "github.com/nbd-wtf/go-nostr" ) type Router struct{ *Relay } type Route struct { eventMatcher func(*nostr.Event) bool filterMatcher func(nostr.Filter) bool relay *Relay } type routeBuilder struct { router *Router eventMatcher func(*nostr.Event) bool filterMatcher func(nostr.Filter) bool } func NewRouter() *Router { rr := &Router{Relay: NewRelay()} rr.routes = make([]Route, 0, 3) rr.getSubRelayFromFilter = func(f nostr.Filter) *Relay { for _, route := range rr.routes { if route.filterMatcher(f) { return route.relay } } return rr.Relay } rr.getSubRelayFromEvent = func(e *nostr.Event) *Relay { for _, route := range rr.routes { if route.eventMatcher(e) { return route.relay } } return rr.Relay } return rr } func (rr *Router) Route() routeBuilder { return routeBuilder{ router: rr, filterMatcher: func(f nostr.Filter) bool { return false }, eventMatcher: func(e *nostr.Event) bool { return false }, } } func (rb routeBuilder) Req(fn func(nostr.Filter) bool) routeBuilder { rb.filterMatcher = fn return rb } func (rb routeBuilder) Event(fn func(*nostr.Event) bool) routeBuilder { rb.eventMatcher = fn return rb } func (rb routeBuilder) Relay(relay *Relay) { rb.router.routes = append(rb.router.routes, Route{ filterMatcher: rb.filterMatcher, eventMatcher: rb.eventMatcher, relay: relay, }) }