func NewResource(m ResourceController) *ResourceRouter { resource := new(ResourceRouter) descriptor := createDescriptor(m, resource) resource.varName = descriptor.varName restfuncs := descriptor.GetRestMap() memberfuncs := descriptor.GetGenericMapList("Member") collectionfuncs := descriptor.GetGenericMapList("Collection") resource.Member = router.New() resource.Member.Routing = memberSignaler{varName: descriptor.varName, indexer: m} memberactions := splitter{} memberactions.get = firstNonNilMiddleware([]rack.Middleware{restfuncs["show"], memberfuncs.get[""], memberfuncs.all[""]}) memberactions.post = firstNonNilMiddleware([]rack.Middleware{memberfuncs.post[""], memberfuncs.all[""]}) memberactions.put = firstNonNilMiddleware([]rack.Middleware{restfuncs["update"], memberfuncs.put[""], memberfuncs.all[""]}) memberactions.delete = firstNonNilMiddleware([]rack.Middleware{restfuncs["destroy"], memberfuncs.delete[""], memberfuncs.all[""]}) resource.Member.Action = memberactions resource.Member.Name = memberNamer{varName: descriptor.varName} if restfuncs["edit"] != nil { memberfuncs.get["edit"] = restfuncs["edit"] } addMapListRoutes(resource.Member, memberfuncs) resource.Collection = router.New() resource.Collection.Routing = collectionSignaler{name: descriptor.routeName} collectionactions := splitter{} collectionactions.get = firstNonNilMiddleware([]rack.Middleware{restfuncs["index"], collectionfuncs.get[""], collectionfuncs.all[""]}) collectionactions.post = firstNonNilMiddleware([]rack.Middleware{restfuncs["create"], collectionfuncs.post[""], collectionfuncs.all[""]}) collectionactions.put = firstNonNilMiddleware([]rack.Middleware{collectionfuncs.put[""], collectionfuncs.all[""]}) collectionactions.delete = firstNonNilMiddleware([]rack.Middleware{collectionfuncs.delete[""], collectionfuncs.all[""]}) resource.Collection.Action = collectionactions resource.Collection.Name = router.NameString(descriptor.routeName) if restfuncs["new"] != nil { collectionfuncs.get["new"] = restfuncs["new"] } addMapListRoutes(resource.Collection, collectionfuncs) resource.Collection.AddRoute(resource.Member) return resource }
//use this to create a route namespace (i.e. "admin"). // name is the string used for the namespace. // intermediate will be ran if the namespace is used (http://example.com/admin/posts). // final will be ran if the namespace is the destination (http://example.com/admin) func NewNamespace(name string, intermediate router.Signaler, final rack.Middleware) *router.Router { r := router.New() r.Routing = router.SignalFunc(func(vars map[string]interface{}) bool { section := router.V(vars).CurrentSection() if !router.V(vars).IsCaseSensitive() { name = strings.ToLower(name) } if section != name { return false } if intermediate != nil { return intermediate.Run(vars) } return true }) r.Action = final return r }