@@ -70,6 +70,29 @@ def process_response(self, response: "AnyDict") -> "ResponseType":
7070 return cast ("ResponseType" , raw_response )
7171
7272
73+ def _parse_nested_response (
74+ response : "AnyDict" , nested_keys : "List[str | int]"
75+ ) -> "Any" :
76+ composite : "Any" = response
77+ for key in nested_keys :
78+ if isinstance (composite , list ):
79+ if not isinstance (key , int ):
80+ raise IndicoInputError (
81+ f"Invalid nested key type: { type (key )} " ,
82+ )
83+ composite = composite [int (key )]
84+ continue
85+
86+ if isinstance (composite , dict ):
87+ if key not in composite .keys ():
88+ raise IndicoInputError (
89+ f"Nested key not found in response: { key } " ,
90+ )
91+ composite = composite [key ]
92+
93+ return composite
94+
95+
7396class PagedRequest (GraphQLRequest [ResponseType ]):
7497 """
7598 To enable pagination, query must include $after as an argument
@@ -100,19 +123,11 @@ def __init__(self, query: str, variables: "Optional[AnyDict]" = None):
100123 super ().__init__ (query , variables = variables )
101124
102125 def parse_payload (
103- self , response : "AnyDict" , nested_keys : "Optional[List[str]]" = None
126+ self , response : "AnyDict" , nested_keys : "Optional[List[str | int ]]" = None
104127 ) -> "Any" :
105128 raw_response : "AnyDict" = cast ("AnyDict" , super ().parse_payload (response ))
106-
107129 if nested_keys :
108- composite = raw_response
109- for key in nested_keys :
110- if key not in composite .keys ():
111- raise IndicoInputError (
112- f"Nested key not found in response: { key } " ,
113- )
114- composite = composite [key ]
115-
130+ composite : "Any" = _parse_nested_response (raw_response , nested_keys )
116131 _pg = composite .get ("pageInfo" )
117132 else :
118133 _pg = next (iter (raw_response .values ())).get ("pageInfo" )
@@ -157,19 +172,12 @@ def __init__(self, query: str, variables: "Optional[AnyDict]" = None):
157172 super ().__init__ (query , variables = variables )
158173
159174 def parse_payload (
160- self , response : "AnyDict" , nested_keys : "Optional[List[str]]" = None
175+ self , response : "AnyDict" , nested_keys : "Optional[List[str | int ]]" = None
161176 ) -> "Any" :
162177 raw_response : "AnyDict" = cast ("AnyDict" , super ().parse_payload (response ))
163178
164179 if nested_keys :
165- composite = raw_response
166- for key in nested_keys :
167- if key not in composite .keys ():
168- raise IndicoInputError (
169- f"Nested key not found in response: { key } " ,
170- )
171- composite = composite [key ]
172-
180+ composite : "Any" = _parse_nested_response (raw_response , nested_keys )
173181 pagination_data = composite
174182 else :
175183 pagination_data = next (iter (raw_response .values ()))
0 commit comments