diff --git a/edgedb/abstract.py b/edgedb/abstract.py index 860275c7..dbac4503 100644 --- a/edgedb/abstract.py +++ b/edgedb/abstract.py @@ -110,6 +110,22 @@ class DescribeContext: output_format: protocol.OutputFormat expect_one: bool + def lower( + self, *, allow_capabilities: enums.Capability + ) -> protocol.ExecuteContext: + return protocol.ExecuteContext( + query=self.query, + args=None, + kwargs=None, + reg=protocol.CodecsRegistry(), + qc=protocol.LRUMapping(maxsize=1), + output_format=self.output_format, + expect_one=self.expect_one, + inline_typenames=self.inject_type_names, + allow_capabilities=allow_capabilities, + state=self.state.as_dict() if self.state else None, + ) + @dataclasses.dataclass class DescribeResult: diff --git a/edgedb/base_client.py b/edgedb/base_client.py index 0744211c..382da052 100644 --- a/edgedb/base_client.py +++ b/edgedb/base_client.py @@ -255,23 +255,15 @@ async def _execute(self, execute_context: abstract.ExecuteContext) -> None: async def describe( self, describe_context: abstract.DescribeContext ) -> abstract.DescribeResult: - cardinality, in_dc, out_dc, capabilities = await self._protocol._parse( - describe_context.query, - reg=protocol.CodecsRegistry(), - inline_typenames=describe_context.inject_type_names, - output_format=describe_context.output_format, - expect_one=describe_context.expect_one, - allow_capabilities=enums.Capability.EXECUTE, - state=( - describe_context.state.as_dict() - if describe_context.state else None - ), + ctx = describe_context.lower( + allow_capabilities=enums.Capability.EXECUTE ) + await self._protocol._parse(ctx) return abstract.DescribeResult( - input_type=in_dc.make_type(describe_context), - output_type=out_dc.make_type(describe_context), - output_cardinality=enums.Cardinality(cardinality[0]), - capabilities=capabilities, + input_type=ctx.in_dc.make_type(describe_context), + output_type=ctx.out_dc.make_type(describe_context), + output_cardinality=enums.Cardinality(ctx.cardinality[0]), + capabilities=ctx.capabilities, ) def terminate(self): diff --git a/edgedb/protocol/protocol.pxd b/edgedb/protocol/protocol.pxd index 402c988c..7140ae4e 100644 --- a/edgedb/protocol/protocol.pxd +++ b/edgedb/protocol/protocol.pxd @@ -85,9 +85,9 @@ cdef class ExecuteContext: object state # Contextual variables - bytes cardinality - BaseCodec in_dc - BaseCodec out_dc + readonly bytes cardinality + readonly BaseCodec in_dc + readonly BaseCodec out_dc readonly uint64_t capabilities cdef inline bint has_na_cardinality(self)