Index: go/src/infra/gae/libs/ephelper/ephelper.go |
diff --git a/go/src/infra/gae/libs/ephelper/ephelper.go b/go/src/infra/gae/libs/ephelper/ephelper.go |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1a16c638d2ace593c9fc5d96c31a506820604de4 |
--- /dev/null |
+++ b/go/src/infra/gae/libs/ephelper/ephelper.go |
@@ -0,0 +1,77 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package ephelper |
+ |
+import ( |
+ "errors" |
+ "fmt" |
+ |
+ "github.com/GoogleCloudPlatform/go-endpoints/endpoints" |
+) |
+ |
+const errPrefix = "endpoints.Register: " |
+ |
+var ( |
+ // ErrServerNil is returned if you pass a nil server to Register. Don't do |
+ // that. |
+ ErrServerNil = errors.New(errPrefix + "server is nil") |
Vadim Sh.
2015/06/03 18:13:39
just let it die with nil-dereference panic. Are yo
|
+ |
+ // ErrServiceNil is returned if you pass a nil service to Register. Don't do |
+ // that. |
+ ErrServiceNil = errors.New(errPrefix + "service is nil") |
+) |
+ |
+// MethodInfoMap is the common registry for an endpoints service. It's |
+// used by infra/libs/endpoints_client to populate its API. |
Vadim Sh.
2015/06/03 18:13:39
update infra/libs/endpoints_client
|
+type MethodInfoMap map[string]*endpoints.MethodInfo |
+ |
+// Register adds an endpoints.RegisterService-compatible service object using |
+// the MethodInfoMap to look up the MethodInfo objects by methodName. It is |
+// intended to be called at init()-time of an app or client which relies on |
+// these endpoints. |
+// |
+// service should be an instance of your service type (as if you were passing |
+// it to "go-endpoints/endpoints".RegisterService). |
+func Register(server *endpoints.Server, service interface{}, si *endpoints.ServiceInfo, mi MethodInfoMap) error { |
+ if server == nil { |
+ return ErrServerNil |
+ } |
+ if service == nil { |
+ return ErrServiceNil |
+ } |
+ if si == nil { |
+ si = &endpoints.ServiceInfo{Default: true} |
+ } |
+ |
+ api, err := server.RegisterService(service, si.Name, si.Version, |
+ si.Description, si.Default) |
Vadim Sh.
2015/06/03 18:13:39
nit: imho line break here is unnecessary
|
+ if err != nil { |
+ return err |
+ } |
+ |
+ for methodName, info := range mi { |
+ method := api.MethodByName(methodName) |
+ if method == nil { |
+ return fmt.Errorf( |
+ errPrefix+"no method %q (did you forget to export it?)", methodName) |
+ } |
+ curInfo := method.Info() |
+ // These three are set automatically based on reflection, so only override |
+ // them if the info object contains something new. |
+ if info.Name == "" { |
+ info.Name = curInfo.Name |
+ } |
+ if info.Path == "" { |
+ info.Path = curInfo.Path |
+ } |
+ if info.HTTPMethod == "" { |
+ info.HTTPMethod = curInfo.HTTPMethod |
+ } |
+ *curInfo = *info |
+ mi[methodName] = curInfo // So that we can observe the merged result |
Vadim Sh.
2015/06/03 18:13:39
is it ok to modify map while iterating over it?
|
+ } |
+ |
+ return nil |
+} |