Merge pull request #30914 from mikedanese/go-restful

Automatic merge from submit-queue

godeps: update go-restful

To pickup https://github.com/emicklei/go-restful/pull/311

@kubernetes/sig-api-machinery
This commit is contained in:
Kubernetes Submit Queue 2016-08-20 17:32:03 -07:00 committed by GitHub
commit 1de858290d
32 changed files with 138 additions and 36 deletions

9
Godeps/Godeps.json generated
View File

@ -866,18 +866,15 @@
}, },
{ {
"ImportPath": "github.com/emicklei/go-restful", "ImportPath": "github.com/emicklei/go-restful",
"Comment": "v1.2-66-gc4afa8e", "Rev": "89ef8af493ab468a45a42bb0d89a06fccdd2fb22"
"Rev": "c4afa8e5421428d584b32d36d7b35f2c9ae5f823"
}, },
{ {
"ImportPath": "github.com/emicklei/go-restful/log", "ImportPath": "github.com/emicklei/go-restful/log",
"Comment": "v1.2-66-gc4afa8e", "Rev": "89ef8af493ab468a45a42bb0d89a06fccdd2fb22"
"Rev": "c4afa8e5421428d584b32d36d7b35f2c9ae5f823"
}, },
{ {
"ImportPath": "github.com/emicklei/go-restful/swagger", "ImportPath": "github.com/emicklei/go-restful/swagger",
"Comment": "v1.2-66-gc4afa8e", "Rev": "89ef8af493ab468a45a42bb0d89a06fccdd2fb22"
"Rev": "c4afa8e5421428d584b32d36d7b35f2c9ae5f823"
}, },
{ {
"ImportPath": "github.com/evanphx/json-patch", "ImportPath": "github.com/evanphx/json-patch",

View File

@ -3,6 +3,10 @@
"apiVersion": "", "apiVersion": "",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/api", "resourcePath": "/api",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/api", "path": "/api",

View File

@ -3,6 +3,10 @@
"apiVersion": "", "apiVersion": "",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/apis", "resourcePath": "/apis",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/apis", "path": "/apis",

View File

@ -3,6 +3,10 @@
"apiVersion": "", "apiVersion": "",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/apis/apps", "resourcePath": "/apis/apps",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/apis/apps", "path": "/apis/apps",

View File

@ -3,6 +3,10 @@
"apiVersion": "apps/v1alpha1", "apiVersion": "apps/v1alpha1",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/apis/apps/v1alpha1", "resourcePath": "/apis/apps/v1alpha1",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/apis/apps/v1alpha1/namespaces/{namespace}/petsets", "path": "/apis/apps/v1alpha1/namespaces/{namespace}/petsets",

View File

@ -3,6 +3,10 @@
"apiVersion": "", "apiVersion": "",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/apis/authentication.k8s.io", "resourcePath": "/apis/authentication.k8s.io",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/apis/authentication.k8s.io", "path": "/apis/authentication.k8s.io",

View File

@ -3,6 +3,10 @@
"apiVersion": "authentication.k8s.io/v1beta1", "apiVersion": "authentication.k8s.io/v1beta1",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/apis/authentication.k8s.io/v1beta1", "resourcePath": "/apis/authentication.k8s.io/v1beta1",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/apis/authentication.k8s.io/v1beta1/tokenreviews", "path": "/apis/authentication.k8s.io/v1beta1/tokenreviews",

View File

@ -3,6 +3,10 @@
"apiVersion": "", "apiVersion": "",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/apis/authorization.k8s.io", "resourcePath": "/apis/authorization.k8s.io",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/apis/authorization.k8s.io", "path": "/apis/authorization.k8s.io",

View File

@ -3,6 +3,10 @@
"apiVersion": "authorization.k8s.io/v1beta1", "apiVersion": "authorization.k8s.io/v1beta1",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/apis/authorization.k8s.io/v1beta1", "resourcePath": "/apis/authorization.k8s.io/v1beta1",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/apis/authorization.k8s.io/v1beta1/subjectaccessreviews", "path": "/apis/authorization.k8s.io/v1beta1/subjectaccessreviews",

View File

@ -3,6 +3,10 @@
"apiVersion": "", "apiVersion": "",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/apis/autoscaling", "resourcePath": "/apis/autoscaling",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/apis/autoscaling", "path": "/apis/autoscaling",

View File

@ -3,6 +3,10 @@
"apiVersion": "autoscaling/v1", "apiVersion": "autoscaling/v1",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/apis/autoscaling/v1", "resourcePath": "/apis/autoscaling/v1",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/apis/autoscaling/v1/namespaces/{namespace}/horizontalpodautoscalers", "path": "/apis/autoscaling/v1/namespaces/{namespace}/horizontalpodautoscalers",

View File

@ -3,6 +3,10 @@
"apiVersion": "", "apiVersion": "",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/apis/batch", "resourcePath": "/apis/batch",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/apis/batch", "path": "/apis/batch",

View File

@ -3,6 +3,10 @@
"apiVersion": "batch/v1", "apiVersion": "batch/v1",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/apis/batch/v1", "resourcePath": "/apis/batch/v1",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/apis/batch/v1/namespaces/{namespace}/jobs", "path": "/apis/batch/v1/namespaces/{namespace}/jobs",

View File

@ -3,6 +3,10 @@
"apiVersion": "batch/v2alpha1", "apiVersion": "batch/v2alpha1",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/apis/batch/v2alpha1", "resourcePath": "/apis/batch/v2alpha1",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/apis/batch/v2alpha1", "path": "/apis/batch/v2alpha1",

View File

@ -3,6 +3,10 @@
"apiVersion": "", "apiVersion": "",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/apis/certificates", "resourcePath": "/apis/certificates",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/apis/certificates", "path": "/apis/certificates",

View File

@ -3,6 +3,10 @@
"apiVersion": "certificates/v1alpha1", "apiVersion": "certificates/v1alpha1",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/apis/certificates/v1alpha1", "resourcePath": "/apis/certificates/v1alpha1",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/apis/certificates/v1alpha1/certificatesigningrequests", "path": "/apis/certificates/v1alpha1/certificatesigningrequests",
@ -866,10 +870,7 @@
], ],
"properties": { "properties": {
"request": { "request": {
"type": "array", "type": "string",
"items": {
"type": "integer"
},
"description": "Base64-encoded PKCS#10 CSR data" "description": "Base64-encoded PKCS#10 CSR data"
}, },
"username": { "username": {
@ -898,10 +899,7 @@
"description": "Conditions applied to the request, such as approval or denial." "description": "Conditions applied to the request, such as approval or denial."
}, },
"certificate": { "certificate": {
"type": "array", "type": "string",
"items": {
"type": "integer"
},
"description": "If request was approved, the controller will place the issued certificate here." "description": "If request was approved, the controller will place the issued certificate here."
} }
} }

View File

@ -3,6 +3,10 @@
"apiVersion": "", "apiVersion": "",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/apis/extensions", "resourcePath": "/apis/extensions",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/apis/extensions", "path": "/apis/extensions",

View File

@ -3,6 +3,10 @@
"apiVersion": "extensions/v1beta1", "apiVersion": "extensions/v1beta1",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/apis/extensions/v1beta1", "resourcePath": "/apis/extensions/v1beta1",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/apis/extensions/v1beta1/namespaces/{namespace}/daemonsets", "path": "/apis/extensions/v1beta1/namespaces/{namespace}/daemonsets",

View File

@ -3,6 +3,10 @@
"apiVersion": "", "apiVersion": "",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/logs", "resourcePath": "/logs",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/logs/{logpath}", "path": "/logs/{logpath}",

View File

@ -3,6 +3,10 @@
"apiVersion": "", "apiVersion": "",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/apis/policy", "resourcePath": "/apis/policy",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/apis/policy", "path": "/apis/policy",

View File

@ -3,6 +3,10 @@
"apiVersion": "policy/v1alpha1", "apiVersion": "policy/v1alpha1",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/apis/policy/v1alpha1", "resourcePath": "/apis/policy/v1alpha1",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/apis/policy/v1alpha1/namespaces/{namespace}/poddisruptionbudgets", "path": "/apis/policy/v1alpha1/namespaces/{namespace}/poddisruptionbudgets",

View File

@ -3,6 +3,10 @@
"apiVersion": "", "apiVersion": "",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/apis/rbac.authorization.k8s.io", "resourcePath": "/apis/rbac.authorization.k8s.io",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/apis/rbac.authorization.k8s.io", "path": "/apis/rbac.authorization.k8s.io",

View File

@ -3,6 +3,10 @@
"apiVersion": "rbac.authorization.k8s.io/v1alpha1", "apiVersion": "rbac.authorization.k8s.io/v1alpha1",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/apis/rbac.authorization.k8s.io/v1alpha1", "resourcePath": "/apis/rbac.authorization.k8s.io/v1alpha1",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/apis/rbac.authorization.k8s.io/v1alpha1/clusterrolebindings", "path": "/apis/rbac.authorization.k8s.io/v1alpha1/clusterrolebindings",

View File

@ -3,6 +3,10 @@
"apiVersion": "v1", "apiVersion": "v1",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/api/v1", "resourcePath": "/api/v1",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/api/v1/namespaces/{namespace}/bindings", "path": "/api/v1/namespaces/{namespace}/bindings",

View File

@ -3,6 +3,10 @@
"apiVersion": "", "apiVersion": "",
"basePath": "https://10.10.10.10:6443", "basePath": "https://10.10.10.10:6443",
"resourcePath": "/version", "resourcePath": "/version",
"info": {
"title": "",
"description": ""
},
"apis": [ "apis": [
{ {
"path": "/version", "path": "/version",

View File

@ -529,7 +529,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
<td class="tableblock halign-left valign-top"><p class="tableblock">request</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">request</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Base64-encoded PKCS#10 CSR data</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Base64-encoded PKCS#10 CSR data</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">integer (int32) array</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td>
</tr> </tr>
<tr> <tr>
@ -695,7 +695,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
<td class="tableblock halign-left valign-top"><p class="tableblock">certificate</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">certificate</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">If request was approved, the controller will place the issued certificate here.</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">If request was approved, the controller will place the issued certificate here.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">integer (int32) array</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td>
</tr> </tr>
</tbody> </tbody>
@ -1304,7 +1304,7 @@ Examples:<br>
</div> </div>
<div id="footer"> <div id="footer">
<div id="footer-text"> <div id="footer-text">
Last updated 2016-07-22 19:31:19 UTC Last updated 2016-08-18 20:08:14 UTC
</div> </div>
</div> </div>
</body> </body>

View File

@ -61,8 +61,8 @@ func (u UserResource) findUser(request *restful.Request, response *restful.Respo
- [Documentation on godoc.org](http://godoc.org/github.com/emicklei/go-restful) - [Documentation on godoc.org](http://godoc.org/github.com/emicklei/go-restful)
- [Code examples](https://github.com/emicklei/go-restful/tree/master/examples) - [Code examples](https://github.com/emicklei/go-restful/tree/master/examples)
- [Example posted on blog](http://ernestmicklei.com/2012/11/24/go-restful-first-working-example/) - [Example posted on blog](http://ernestmicklei.com/2012/11/go-restful-first-working-example/)
- [Design explained on blog](http://ernestmicklei.com/2012/11/11/go-restful-api-design/) - [Design explained on blog](http://ernestmicklei.com/2012/11/go-restful-api-design/)
- [sourcegraph](https://sourcegraph.com/github.com/emicklei/go-restful) - [sourcegraph](https://sourcegraph.com/github.com/emicklei/go-restful)
- [gopkg.in](https://gopkg.in/emicklei/go-restful.v1) - [gopkg.in](https://gopkg.in/emicklei/go-restful.v1)
- [showcase: Mora - MongoDB REST Api server](https://github.com/emicklei/mora) - [showcase: Mora - MongoDB REST Api server](https://github.com/emicklei/mora)

View File

@ -283,12 +283,12 @@ func fixedPrefixPath(pathspec string) string {
} }
// ServeHTTP implements net/http.Handler therefore a Container can be a Handler in a http.Server // ServeHTTP implements net/http.Handler therefore a Container can be a Handler in a http.Server
func (c Container) ServeHTTP(httpwriter http.ResponseWriter, httpRequest *http.Request) { func (c *Container) ServeHTTP(httpwriter http.ResponseWriter, httpRequest *http.Request) {
c.ServeMux.ServeHTTP(httpwriter, httpRequest) c.ServeMux.ServeHTTP(httpwriter, httpRequest)
} }
// Handle registers the handler for the given pattern. If a handler already exists for pattern, Handle panics. // Handle registers the handler for the given pattern. If a handler already exists for pattern, Handle panics.
func (c Container) Handle(pattern string, handler http.Handler) { func (c *Container) Handle(pattern string, handler http.Handler) {
c.ServeMux.Handle(pattern, handler) c.ServeMux.Handle(pattern, handler)
} }
@ -318,7 +318,7 @@ func (c *Container) Filter(filter FilterFunction) {
} }
// RegisteredWebServices returns the collections of added WebServices // RegisteredWebServices returns the collections of added WebServices
func (c Container) RegisteredWebServices() []*WebService { func (c *Container) RegisteredWebServices() []*WebService {
c.webServicesLock.RLock() c.webServicesLock.RLock()
defer c.webServicesLock.RUnlock() defer c.webServicesLock.RUnlock()
result := make([]*WebService, len(c.webServices)) result := make([]*WebService, len(c.webServices))
@ -329,7 +329,7 @@ func (c Container) RegisteredWebServices() []*WebService {
} }
// computeAllowedMethods returns a list of HTTP methods that are valid for a Request // computeAllowedMethods returns a list of HTTP methods that are valid for a Request
func (c Container) computeAllowedMethods(req *Request) []string { func (c *Container) computeAllowedMethods(req *Request) []string {
// Go through all RegisteredWebServices() and all its Routes to collect the options // Go through all RegisteredWebServices() and all its Routes to collect the options
methods := []string{} methods := []string{}
requestPath := req.Request.URL.Path requestPath := req.Request.URL.Path

View File

@ -1,9 +1,10 @@
go test -test.v ...restful && \
go test -test.v ...swagger && \
go vet ...restful && \
go fmt ...swagger && \
go install ...swagger && \
go fmt ...restful && \
go install ...restful
cd examples cd examples
ls *.go | xargs -I {} go build -o /tmp/ignore {} ls *.go | xargs -I {} go build -o /tmp/ignore {}
cd .. cd ..
go fmt ...swagger && \
go test -test.v ...swagger && \
go install ...swagger && \
go fmt ...restful && \
go test -test.v ...restful && \
go install ...restful

View File

@ -51,6 +51,14 @@ func (b modelBuilder) addModel(st reflect.Type, nameOverride string) *Model {
if b.isPrimitiveType(modelName) { if b.isPrimitiveType(modelName) {
return nil return nil
} }
// golang encoding/json packages says array and slice values encode as
// JSON arrays, except that []byte encodes as a base64-encoded string.
// If we see a []byte here, treat it at as a primitive type (string)
// and deal with it in buildArrayTypeProperty.
if (st.Kind() == reflect.Slice || st.Kind() == reflect.Array) &&
st.Elem().Kind() == reflect.Uint8 {
return nil
}
// see if we already have visited this model // see if we already have visited this model
if _, ok := b.Models.At(modelName); ok { if _, ok := b.Models.At(modelName); ok {
return nil return nil
@ -276,6 +284,11 @@ func (b modelBuilder) buildArrayTypeProperty(field reflect.StructField, jsonName
return jsonName, prop return jsonName, prop
} }
fieldType := field.Type fieldType := field.Type
if fieldType.Elem().Kind() == reflect.Uint8 {
stringt := "string"
prop.Type = &stringt
return jsonName, prop
}
var pType = "array" var pType = "array"
prop.Type = &pType prop.Type = &pType
isPrimitive := b.isPrimitiveType(fieldType.Elem().Name()) isPrimitive := b.isPrimitiveType(fieldType.Elem().Name())

View File

@ -118,6 +118,7 @@ type ApiDeclaration struct {
ApiVersion string `json:"apiVersion"` ApiVersion string `json:"apiVersion"`
BasePath string `json:"basePath"` BasePath string `json:"basePath"`
ResourcePath string `json:"resourcePath"` // must start with / ResourcePath string `json:"resourcePath"` // must start with /
Info Info `json:"info"`
Apis []Api `json:"apis,omitempty"` Apis []Api `json:"apis,omitempty"`
Models ModelList `json:"models,omitempty"` Models ModelList `json:"models,omitempty"`
Produces []string `json:"produces,omitempty"` Produces []string `json:"produces,omitempty"`

View File

@ -1,7 +1,7 @@
package restful package restful
import ( import (
"fmt" "errors"
"os" "os"
"sync" "sync"
@ -51,7 +51,7 @@ func (w *WebService) ApiVersion(apiVersion string) *WebService {
} }
// Version returns the API version for documentation purposes. // Version returns the API version for documentation purposes.
func (w WebService) Version() string { return w.apiVersion } func (w *WebService) Version() string { return w.apiVersion }
// Path specifies the root URL template path of the WebService. // Path specifies the root URL template path of the WebService.
// All Routes will be relative to this path. // All Routes will be relative to this path.
@ -155,7 +155,7 @@ func (w *WebService) Route(builder *RouteBuilder) *WebService {
// RemoveRoute removes the specified route, looks for something that matches 'path' and 'method' // RemoveRoute removes the specified route, looks for something that matches 'path' and 'method'
func (w *WebService) RemoveRoute(path, method string) error { func (w *WebService) RemoveRoute(path, method string) error {
if !w.dynamicRoutes { if !w.dynamicRoutes {
return fmt.Errorf("dynamic routes are not enabled.") return errors.New("dynamic routes are not enabled.")
} }
w.routesLock.Lock() w.routesLock.Lock()
defer w.routesLock.Unlock() defer w.routesLock.Unlock()
@ -192,7 +192,7 @@ func (w *WebService) Consumes(accepts ...string) *WebService {
} }
// Routes returns the Routes associated with this WebService // Routes returns the Routes associated with this WebService
func (w WebService) Routes() []Route { func (w *WebService) Routes() []Route {
if !w.dynamicRoutes { if !w.dynamicRoutes {
return w.routes return w.routes
} }
@ -207,12 +207,12 @@ func (w WebService) Routes() []Route {
} }
// RootPath returns the RootPath associated with this WebService. Default "/" // RootPath returns the RootPath associated with this WebService. Default "/"
func (w WebService) RootPath() string { func (w *WebService) RootPath() string {
return w.rootPath return w.rootPath
} }
// PathParameters return the path parameter names for (shared amoung its Routes) // PathParameters return the path parameter names for (shared amoung its Routes)
func (w WebService) PathParameters() []*Parameter { func (w *WebService) PathParameters() []*Parameter {
return w.pathParameters return w.pathParameters
} }
@ -229,7 +229,7 @@ func (w *WebService) Doc(plainText string) *WebService {
} }
// Documentation returns it. // Documentation returns it.
func (w WebService) Documentation() string { func (w *WebService) Documentation() string {
return w.documentation return w.documentation
} }