diff --git a/.gitignore b/.gitignore index 01136b1..13e0cb4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules *.pyc +.idea \ No newline at end of file diff --git a/client/golang/client.go b/client/golang/client.go new file mode 100644 index 0000000..9d69983 --- /dev/null +++ b/client/golang/client.go @@ -0,0 +1,31 @@ +package main + +import ( + pb "github.com/johnkariuki/grpc-protobuf-tutorial/proto" + "google.golang.org/grpc" + "log" + "context" + "fmt" +) + +var employees = map[string]*pb.Employee{ + "eligible": &pb.Employee{12,"Peter",19,10}, + "ineligible": &pb.Employee{14,"John",13,29}, +} + +func main(){ + conn,err := grpc.Dial("localhost:50050",grpc.WithInsecure()) + if err != nil { + log.Fatalf("did not connect :%v",err) + } + defer conn.Close() + c := pb.NewEmployeeLeaveDaysServiceClient(conn) + for _,emp := range employees { + eligibility, err := c.EligibleForLeave(context.Background(), emp) + if err != nil { + log.Fatalf("got error %v", err) + } + fmt.Printf("Eligibility of %v : %v\n",emp.Name,eligibility.Eligible) + } + +} diff --git a/proto/work_leave.pb.go b/proto/work_leave.pb.go new file mode 100644 index 0000000..b0d8081 --- /dev/null +++ b/proto/work_leave.pb.go @@ -0,0 +1,261 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: work_leave.proto + +/* +Package work_leave is a generated protocol buffer package. + +It is generated from these files: + work_leave.proto + +It has these top-level messages: + Employee + LeaveEligibility + LeaveFeedback +*/ +package work_leave + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +import ( + context "golang.org/x/net/context" + grpc "google.golang.org/grpc" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// Message Type fefinition for an Employee. +type Employee struct { + EmployeeId int32 `protobuf:"varint,1,opt,name=employee_id,json=employeeId" json:"employee_id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` + AccruedLeaveDays float32 `protobuf:"fixed32,3,opt,name=accrued_leave_days,json=accruedLeaveDays" json:"accrued_leave_days,omitempty"` + RequestedLeaveDays float32 `protobuf:"fixed32,4,opt,name=requested_leave_days,json=requestedLeaveDays" json:"requested_leave_days,omitempty"` +} + +func (m *Employee) Reset() { *m = Employee{} } +func (m *Employee) String() string { return proto.CompactTextString(m) } +func (*Employee) ProtoMessage() {} +func (*Employee) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +func (m *Employee) GetEmployeeId() int32 { + if m != nil { + return m.EmployeeId + } + return 0 +} + +func (m *Employee) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Employee) GetAccruedLeaveDays() float32 { + if m != nil { + return m.AccruedLeaveDays + } + return 0 +} + +func (m *Employee) GetRequestedLeaveDays() float32 { + if m != nil { + return m.RequestedLeaveDays + } + return 0 +} + +// Message Type definition for LeaveEligibility response. +type LeaveEligibility struct { + Eligible bool `protobuf:"varint,1,opt,name=eligible" json:"eligible,omitempty"` +} + +func (m *LeaveEligibility) Reset() { *m = LeaveEligibility{} } +func (m *LeaveEligibility) String() string { return proto.CompactTextString(m) } +func (*LeaveEligibility) ProtoMessage() {} +func (*LeaveEligibility) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +func (m *LeaveEligibility) GetEligible() bool { + if m != nil { + return m.Eligible + } + return false +} + +// Message Type definition for LeaveFeedback response. +type LeaveFeedback struct { + Granted bool `protobuf:"varint,1,opt,name=granted" json:"granted,omitempty"` + AccruedLeaveDays float32 `protobuf:"fixed32,2,opt,name=accrued_leave_days,json=accruedLeaveDays" json:"accrued_leave_days,omitempty"` + GrantedLeaveDays float32 `protobuf:"fixed32,3,opt,name=granted_leave_days,json=grantedLeaveDays" json:"granted_leave_days,omitempty"` +} + +func (m *LeaveFeedback) Reset() { *m = LeaveFeedback{} } +func (m *LeaveFeedback) String() string { return proto.CompactTextString(m) } +func (*LeaveFeedback) ProtoMessage() {} +func (*LeaveFeedback) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +func (m *LeaveFeedback) GetGranted() bool { + if m != nil { + return m.Granted + } + return false +} + +func (m *LeaveFeedback) GetAccruedLeaveDays() float32 { + if m != nil { + return m.AccruedLeaveDays + } + return 0 +} + +func (m *LeaveFeedback) GetGrantedLeaveDays() float32 { + if m != nil { + return m.GrantedLeaveDays + } + return 0 +} + +func init() { + proto.RegisterType((*Employee)(nil), "work_leave.Employee") + proto.RegisterType((*LeaveEligibility)(nil), "work_leave.LeaveEligibility") + proto.RegisterType((*LeaveFeedback)(nil), "work_leave.LeaveFeedback") +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// Client API for EmployeeLeaveDaysService service + +type EmployeeLeaveDaysServiceClient interface { + EligibleForLeave(ctx context.Context, in *Employee, opts ...grpc.CallOption) (*LeaveEligibility, error) + GrantLeave(ctx context.Context, in *Employee, opts ...grpc.CallOption) (*LeaveFeedback, error) +} + +type employeeLeaveDaysServiceClient struct { + cc *grpc.ClientConn +} + +func NewEmployeeLeaveDaysServiceClient(cc *grpc.ClientConn) EmployeeLeaveDaysServiceClient { + return &employeeLeaveDaysServiceClient{cc} +} + +func (c *employeeLeaveDaysServiceClient) EligibleForLeave(ctx context.Context, in *Employee, opts ...grpc.CallOption) (*LeaveEligibility, error) { + out := new(LeaveEligibility) + err := grpc.Invoke(ctx, "/work_leave.EmployeeLeaveDaysService/EligibleForLeave", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *employeeLeaveDaysServiceClient) GrantLeave(ctx context.Context, in *Employee, opts ...grpc.CallOption) (*LeaveFeedback, error) { + out := new(LeaveFeedback) + err := grpc.Invoke(ctx, "/work_leave.EmployeeLeaveDaysService/grantLeave", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// Server API for EmployeeLeaveDaysService service + +type EmployeeLeaveDaysServiceServer interface { + EligibleForLeave(context.Context, *Employee) (*LeaveEligibility, error) + GrantLeave(context.Context, *Employee) (*LeaveFeedback, error) +} + +func RegisterEmployeeLeaveDaysServiceServer(s *grpc.Server, srv EmployeeLeaveDaysServiceServer) { + s.RegisterService(&_EmployeeLeaveDaysService_serviceDesc, srv) +} + +func _EmployeeLeaveDaysService_EligibleForLeave_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Employee) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(EmployeeLeaveDaysServiceServer).EligibleForLeave(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/work_leave.EmployeeLeaveDaysService/EligibleForLeave", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(EmployeeLeaveDaysServiceServer).EligibleForLeave(ctx, req.(*Employee)) + } + return interceptor(ctx, in, info, handler) +} + +func _EmployeeLeaveDaysService_GrantLeave_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Employee) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(EmployeeLeaveDaysServiceServer).GrantLeave(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/work_leave.EmployeeLeaveDaysService/GrantLeave", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(EmployeeLeaveDaysServiceServer).GrantLeave(ctx, req.(*Employee)) + } + return interceptor(ctx, in, info, handler) +} + +var _EmployeeLeaveDaysService_serviceDesc = grpc.ServiceDesc{ + ServiceName: "work_leave.EmployeeLeaveDaysService", + HandlerType: (*EmployeeLeaveDaysServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "EligibleForLeave", + Handler: _EmployeeLeaveDaysService_EligibleForLeave_Handler, + }, + { + MethodName: "grantLeave", + Handler: _EmployeeLeaveDaysService_GrantLeave_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "work_leave.proto", +} + +func init() { proto.RegisterFile("work_leave.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 282 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x52, 0xcd, 0x4a, 0xc3, 0x40, + 0x10, 0x66, 0x6b, 0xd5, 0x38, 0x22, 0x84, 0xa1, 0x87, 0x58, 0x04, 0x43, 0x4e, 0x39, 0x94, 0x20, + 0x7a, 0xf6, 0x66, 0x02, 0x82, 0xa7, 0xf8, 0x00, 0x61, 0x93, 0x1d, 0xca, 0xd2, 0xb4, 0x5b, 0x37, + 0x69, 0x25, 0x0f, 0xe0, 0x73, 0x88, 0x6f, 0x2a, 0xae, 0xbb, 0x6b, 0xa5, 0xd6, 0xdb, 0x7c, 0x7f, + 0x93, 0x2f, 0x93, 0x40, 0xf8, 0xaa, 0xf4, 0xa2, 0x6a, 0x89, 0x6f, 0x29, 0x5b, 0x6b, 0xd5, 0x2b, + 0x84, 0x1f, 0x26, 0x79, 0x67, 0x10, 0xe4, 0xcb, 0x75, 0xab, 0x06, 0x22, 0xbc, 0x86, 0x73, 0xb2, + 0x73, 0x25, 0x45, 0xc4, 0x62, 0x96, 0x1e, 0x97, 0xe0, 0xa8, 0x47, 0x81, 0x08, 0xe3, 0x15, 0x5f, + 0x52, 0x34, 0x8a, 0x59, 0x7a, 0x56, 0x9a, 0x19, 0x67, 0x80, 0xbc, 0x69, 0xf4, 0x86, 0xc4, 0xf7, + 0xca, 0x4a, 0xf0, 0xa1, 0x8b, 0x8e, 0x62, 0x96, 0x8e, 0xca, 0xd0, 0x2a, 0x4f, 0x5f, 0xc2, 0x03, + 0x1f, 0x3a, 0xbc, 0x81, 0x89, 0xa6, 0x97, 0x0d, 0x75, 0xfd, 0x6f, 0xff, 0xd8, 0xf8, 0xd1, 0x6b, + 0x3e, 0x91, 0x64, 0x10, 0x1a, 0x90, 0xb7, 0x72, 0x2e, 0x6b, 0xd9, 0xca, 0x7e, 0xc0, 0x29, 0x04, + 0x64, 0x60, 0x4b, 0xa6, 0x65, 0x50, 0x7a, 0x9c, 0xbc, 0x31, 0xb8, 0x30, 0x81, 0x82, 0x48, 0xd4, + 0xbc, 0x59, 0x60, 0x04, 0xa7, 0x73, 0xcd, 0x57, 0x3d, 0x09, 0x6b, 0x76, 0xf0, 0x40, 0xf7, 0xd1, + 0x81, 0xee, 0x33, 0x40, 0x1b, 0xfc, 0xe3, 0x4d, 0xad, 0xe2, 0xdd, 0xb7, 0x1f, 0x0c, 0x22, 0x77, + 0x59, 0xcf, 0x3e, 0x93, 0xde, 0xca, 0x86, 0xb0, 0x80, 0x30, 0xb7, 0x85, 0x0b, 0xa5, 0x8d, 0x8c, + 0x93, 0x6c, 0xe7, 0x4b, 0xb9, 0xe4, 0xf4, 0x6a, 0x97, 0xdd, 0x3b, 0xc4, 0x3d, 0x80, 0x79, 0xf0, + 0x7f, 0x1b, 0x2e, 0xf7, 0x36, 0xb8, 0xcb, 0xd4, 0x27, 0xe6, 0x87, 0xb8, 0xfb, 0x0c, 0x00, 0x00, + 0xff, 0xff, 0xe5, 0x2c, 0x0d, 0xce, 0x24, 0x02, 0x00, 0x00, +} diff --git a/server/golang/server.go b/server/golang/server.go new file mode 100644 index 0000000..afea69d --- /dev/null +++ b/server/golang/server.go @@ -0,0 +1,38 @@ +package main + +import ( + "context" + pb "github.com/johnkariuki/grpc-protobuf-tutorial/proto" + "log" + "net" + + "google.golang.org/grpc" + "google.golang.org/grpc/reflection" +) + +const ( + port = ":50050" +) + +type employeeLeaveDays struct{} + +func (e *employeeLeaveDays) EligibleForLeave(ctx context.Context, emp *pb.Employee) (*pb.LeaveEligibility, error) { + return &pb.LeaveEligibility{emp.AccruedLeaveDays >= emp.RequestedLeaveDays}, nil +} + +func (e *employeeLeaveDays) GrantLeave(ctx context.Context, emp *pb.Employee) (*pb.LeaveFeedback, error) { + return &pb.LeaveFeedback{true, emp.AccruedLeaveDays - emp.RequestedLeaveDays, emp.RequestedLeaveDays}, nil +} + +func main() { + lis, err := net.Listen("tcp", port) + if err != nil { + log.Fatalf("failed to listen %v", err) + } + s := grpc.NewServer() + pb.RegisterEmployeeLeaveDaysServiceServer(s, &employeeLeaveDays{}) + reflection.Register(s) + if err = s.Serve(lis); err != nil { + log.Fatalf("failed to serve %v", err) + } +}