Generating a gRPC Service
ent/schema/user.go
Now re-run code-generation:
go generate ./...
First, entproto
added a service definition to entpb.proto
:
ent/proto/entpb/entpb.proto
service UserService {
rpc Create ( CreateUserRequest ) returns ( User );
rpc Get ( GetUserRequest ) returns ( User );
rpc Update ( UpdateUserRequest ) returns ( User );
rpc List ( ListUserRequest ) returns ( ListUserResponse );
}
ent/proto/entpb/entpb_grpc.pb.go
The second file, entpub_user_service.go
contains a generated implementation for this interface. For example, an implementation for the Get
method:
// Get implements UserServiceServer.Get
func (svc *UserService) Get(ctx context.Context, req *GetUserRequest) (*User, error) {
var (
err error
get *ent.User
)
id := int(req.GetId())
switch req.GetView() {
get, err = svc.client.User.Get(ctx, id)
case GetUserRequest_WITH_EDGE_IDS:
Where(user.ID(id)).
Only(ctx)
default:
return nil, status.Error(codes.InvalidArgument, "invalid argument: unknown view")
}
switch {
case err == nil:
return toProtoUser(get)
case ent.IsNotFound(err):
return nil, status.Errorf(codes.NotFound, "not found: %s", err)
default:
return nil, status.Errorf(codes.Internal, "internal error: %s", err)
Not bad! Next, let’s create a gRPC server that can serve requests to our service.