thrift/tchan-meta.go (119 lines of code) (raw):

// Copyright (c) 2015 Uber Technologies, Inc. // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. package thrift import ( "fmt" athrift "github.com/uber/tchannel-go/thirdparty/github.com/apache/thrift/lib/go/thrift" gen "github.com/uber/tchannel-go/thrift/gen-go/meta" ) // Interfaces for the service and client for the services defined in the IDL. // tchanMeta is the interface that defines the server handler and client interface. type tchanMeta interface { Health(ctx Context, req *gen.HealthRequest) (*gen.HealthStatus, error) ThriftIDL(ctx Context) (*gen.ThriftIDLs, error) VersionInfo(ctx Context) (*gen.VersionInfo, error) } // Implementation of a client and service handler. type tchanMetaClient struct { thriftService string client TChanClient } func newTChanMetaClient(client TChanClient) tchanMeta { return &tchanMetaClient{ "Meta", client, } } func (c *tchanMetaClient) Health(ctx Context, req *gen.HealthRequest) (*gen.HealthStatus, error) { var resp gen.MetaHealthResult args := gen.MetaHealthArgs{ Hr: req, } success, err := c.client.Call(ctx, c.thriftService, "health", &args, &resp) if err == nil && !success { } return resp.GetSuccess(), err } func (c *tchanMetaClient) ThriftIDL(ctx Context) (*gen.ThriftIDLs, error) { var resp gen.MetaThriftIDLResult args := gen.MetaThriftIDLArgs{} success, err := c.client.Call(ctx, c.thriftService, "thriftIDL", &args, &resp) if err == nil && !success { } return resp.GetSuccess(), err } func (c *tchanMetaClient) VersionInfo(ctx Context) (*gen.VersionInfo, error) { var resp gen.MetaVersionInfoResult args := gen.MetaVersionInfoArgs{} success, err := c.client.Call(ctx, c.thriftService, "versionInfo", &args, &resp) if err == nil && !success { } return resp.GetSuccess(), err } type tchanMetaServer struct { handler tchanMeta } func newTChanMetaServer(handler tchanMeta) TChanServer { return &tchanMetaServer{ handler, } } func (s *tchanMetaServer) Service() string { return "Meta" } func (s *tchanMetaServer) Methods() []string { return []string{ "health", "thriftIDL", "versionInfo", } } func (s *tchanMetaServer) Handle(ctx Context, methodName string, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { switch methodName { case "health": return s.handleHealth(ctx, protocol) case "thriftIDL": return s.handleThriftIDL(ctx, protocol) case "versionInfo": return s.handleVersionInfo(ctx, protocol) default: return false, nil, fmt.Errorf("method %v not found in service %v", methodName, s.Service()) } } func (s *tchanMetaServer) handleHealth(ctx Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { var req gen.MetaHealthArgs var res gen.MetaHealthResult if err := req.Read(protocol); err != nil { return false, nil, err } r, err := s.handler.Health(ctx, req.Hr) if err != nil { return false, nil, err } res.Success = r return err == nil, &res, nil } func (s *tchanMetaServer) handleThriftIDL(ctx Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { var req gen.MetaThriftIDLArgs var res gen.MetaThriftIDLResult if err := req.Read(protocol); err != nil { return false, nil, err } r, err := s.handler.ThriftIDL(ctx) if err != nil { return false, nil, err } res.Success = r return err == nil, &res, nil } func (s *tchanMetaServer) handleVersionInfo(ctx Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { var req gen.MetaVersionInfoArgs var res gen.MetaVersionInfoResult if err := req.Read(protocol); err != nil { return false, nil, err } r, err := s.handler.VersionInfo(ctx) if err != nil { return false, nil, err } res.Success = r return err == nil, &res, nil }