Search code examples
restgomuxgoa

Object containing a map?


I'm trying to get a list of all of our endpoints.

We use Goa.

I noticed that we add all of our endpoints to a service (goa.New("service_name")). I also realized that if I print service.Mux I can see all the endpoints. However, the endpoints look like they are in a Map, which is contained by an object. When printing service.Mux, I see memory addresses as well. How do I get just the endpoints alone?

fmt.Println("Service Mux: ", service.Mux)

&{0xc42092c640 map[OPTIONS/api/my/endpoint/:endpointID/relationships/links:0x77d370 ...]}

Solution

  • You could use the reflect and unsafe packages to get to the underlying and unexported map value, which is defined here (https://github.com/goadesign/goa/blob/master/mux.go#L48).

    Something like this:

    rv := reflect.ValueOf(service.Mux).Elem()
    rf := rv.FieldByName("handles")
    rf = reflect.NewAt(rf.Type(), unsafe.Pointer(rf.UnsafeAddr())).Elem()
    
    handles := rf.Interface().(map[string]goa.MuxHandler)
    for k, h := range handles {
        fmt.Println(k, h)
    }
    

    But do note, that with this approach your code depends on an implementation detail as opposed to a public API, and therefore you cannot rely on its stability.