1
votes

I have been trying to setup a JSON config file to setup dynamic routes for my application. The idea is that I will be able to setup my own URL structure depending on who is using the service. I have a struct that takes in JSON and that works fine. I am using gorilla mux.

 type CustomRoute struct {
    Name string
    Method string
    Path string
    HandleFunc string
 }

The JSON is basically identical to the struct and it goes in fine.

The issue I have is getting the HandleFunc section.

Here is the code:

func NewRouter() *mux.Router {

routerInstance := mux.NewRouter().StrictSlash(true)

    /*
    All routes from the routing table
    */

    // r = []CustomRoute with the JSON data 
    r := loadRoute()
    for _, route := range r {
       var handler http.Handler

       handler = route.HandlerFunc
       handler = core.Logger(handler, route.Name)

       routerInstance.
           Methods(route.Method).
           Path(route.Path).
           Name(route.Name).
           Handler(handler)

    }

    return routerInstance
}

I always get the following error (as one would expect)

cannot use route.HandlerFunc (type string) as type http.Handler in assignment: string does not implement http.Handler (missing ServeHTTP method)

I was told to use something like:

var functions = map[string]interface{}{
    "HandleFunc1": HandleFunc1,
}

But I have no idea how to make this work

2

2 Answers

1
votes

Thanks to RayenWindspear I was able to fix the problem. It was very simple (like everything). The map code should look like this:

var functions = map[string]http.HandlerFunc{
    "HandleFunc1": HandleFunc1,
}
1
votes

I am using a mux for subdomains, so my examples may be a bit off. The map you are being told to use is done something like this:

type Handlers map[string]http.HandlerFunc

func (handlers Handlers) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    path := r.URL.Path
    if handle := handlers[path]; handle != nil {
        handle.ServeHTTP(w, r)
    } else {
        http.Error(w, "Not found", 404)
    }
}