public async Task ReceiveAsync(IContext context)
        {
            switch (context.Message)
            {
            case Started _:
            {
                _inner = _grains._HelloGrainFactory();
                context.SetReceiveTimeout(TimeSpan.FromSeconds(30));
                break;
            }

            case ReceiveTimeout _:
            {
                context.Stop(context.Self);
                break;
            }

            case GrainRequest request:
            {
                switch (request.MethodIndex)
                {
                case 0:
                {
                    var r = HelloRequest.Parser.ParseFrom(request.MessageData);
                    try
                    {
                        var res = await _inner.SayHello(r);

                        var grainResponse = new GrainResponse
                        {
                            MessageData = res.ToByteString(),
                        };
                        context.Respond(grainResponse);
                    }
                    catch (Exception x)
                    {
                        var grainErrorResponse = new GrainErrorResponse
                        {
                            Err = x.ToString()
                        };
                        context.Respond(grainErrorResponse);
                    }

                    break;
                }
                }

                break;
            }
            }
        }
        public async Task ReceiveAsync(IContext context)
        {
            switch (context.Message)
            {
            case Started _:
            {
                _inner = Grains._HelloGrainFactory();
                break;
            }

            case GrainRequest request:
            {
                switch (request.Method)
                {
                case "SayHello":
                {
                    var r = HelloRequest.Parser.ParseFrom(request.MessageData);
                    try
                    {
                        var res = await _inner.SayHello(r);

                        var grainResponse = new GrainResponse
                        {
                            MessageData = res.ToByteString(),
                        };
                        context.Respond(grainResponse);
                    }
                    catch (Exception x)
                    {
                        var grainErrorResponse = new GrainErrorResponse
                        {
                            Err = x.ToString()
                        };
                        context.Respond(grainErrorResponse);
                    }

                    break;
                }
                }

                break;
            }
            }
        }
        public async Task <HelloResponse> SayHello(HelloRequest request, CancellationToken ct, GrainCallOptions options = null)
        {
            options ??= GrainCallOptions.Default;

            var gr = new GrainRequest
            {
                MethodIndex = 0,
                MessageData = request.ToByteString()
            };

            async Task <HelloResponse> Inner()
            {
                //request the RPC method to be invoked
                var res = await _cluster.RequestAsync <object>(_id, "HelloGrain", gr, ct);

                return(res switch
                {
                    // normal response
                    GrainResponse grainResponse => HelloResponse.Parser.ParseFrom(grainResponse.MessageData),
                    // error response
                    GrainErrorResponse grainErrorResponse => throw new Exception(grainErrorResponse.Err),
                    // unsupported response
                    _ => throw new NotSupportedException()
                });