1313# pylint: disable=no-member
1414from frequenz .api .electricity_trading .v1 import electricity_trading_pb2
1515from frequenz .api .electricity_trading .v1 .electricity_trading_pb2_grpc import (
16+ ElectricityTradingServiceAsyncStub ,
1617 ElectricityTradingServiceStub ,
1718)
1819from frequenz .channels import Receiver
1920from frequenz .client .base .client import BaseApiClient
21+ from frequenz .client .base .exception import ClientNotConnected
2022from frequenz .client .base .streaming import GrpcStreamBroadcaster
2123from frequenz .client .common .pagination import Params
2224from google .protobuf import field_mask_pb2 , struct_pb2
@@ -81,7 +83,7 @@ def validate_decimal_places(value: Decimal, decimal_places: int, name: str) -> N
8183 ) from exc
8284
8385
84- class Client (BaseApiClient [ ElectricityTradingServiceStub ] ):
86+ class Client (BaseApiClient ):
8587 """Electricity trading client."""
8688
8789 _instances : dict [tuple [str , str | None ], "Client" ] = {}
@@ -123,7 +125,11 @@ def __init__(
123125 if not hasattr (
124126 self , "_initialized"
125127 ): # Prevent re-initialization of existing instances
126- super ().__init__ (server_url , ElectricityTradingServiceStub , connect = connect )
128+ super ().__init__ (server_url , connect = connect )
129+ self ._stub = cast (
130+ ElectricityTradingServiceAsyncStub ,
131+ ElectricityTradingServiceStub (self .channel ),
132+ )
127133 self ._initialized = True
128134
129135 self ._gridpool_orders_streams : dict [
@@ -149,6 +155,21 @@ def __init__(
149155
150156 self ._metadata = (("key" , auth_key ),) if auth_key else ()
151157
158+ @property
159+ def stub (self ) -> ElectricityTradingServiceAsyncStub :
160+ """
161+ Get the gRPC stub for the Electricity Trading service.
162+
163+ Returns:
164+ The gRPC stub.
165+
166+ Raises:
167+ ClientNotConnected: If the client is not connected to the server.
168+ """
169+ if self ._channel is None :
170+ raise ClientNotConnected (server_url = self .server_url , operation = "stub" )
171+ return self ._stub
172+
152173 async def stream_gridpool_orders (
153174 # pylint: disable=too-many-arguments, too-many-positional-arguments
154175 self ,
@@ -192,7 +213,7 @@ async def stream_gridpool_orders(
192213 try :
193214 self ._gridpool_orders_streams [stream_key ] = GrpcStreamBroadcaster (
194215 f"electricity-trading-{ stream_key } " ,
195- lambda : self .stub .ReceiveGridpoolOrdersStream ( # type: ignore
216+ lambda : self .stub .ReceiveGridpoolOrdersStream (
196217 electricity_trading_pb2 .ReceiveGridpoolOrdersStreamRequest (
197218 gridpool_id = gridpool_id ,
198219 filter = gridpool_order_filter .to_pb (),
@@ -251,7 +272,7 @@ async def stream_gridpool_trades(
251272 try :
252273 self ._gridpool_trades_streams [stream_key ] = GrpcStreamBroadcaster (
253274 f"electricity-trading-{ stream_key } " ,
254- lambda : self .stub .ReceiveGridpoolTradesStream ( # type: ignore
275+ lambda : self .stub .ReceiveGridpoolTradesStream (
255276 electricity_trading_pb2 .ReceiveGridpoolTradesStreamRequest (
256277 gridpool_id = gridpool_id ,
257278 filter = gridpool_trade_filter .to_pb (),
@@ -303,7 +324,7 @@ async def stream_public_trades(
303324 self ._public_trades_streams [public_trade_filter ] = (
304325 GrpcStreamBroadcaster (
305326 f"electricity-trading-{ public_trade_filter } " ,
306- lambda : self .stub .ReceivePublicTradesStream ( # type: ignore
327+ lambda : self .stub .ReceivePublicTradesStream (
307328 electricity_trading_pb2 .ReceivePublicTradesStreamRequest (
308329 filter = public_trade_filter .to_pb (),
309330 ),
0 commit comments