|
7 | 7 |
|
8 | 8 | import requests |
9 | 9 |
|
10 | | -from pyzipcodeapi.dataclass import Distance, Error, MultiDistance, Radius, MultiRadius |
| 10 | +from pyzipcodeapi.dataclass import Distance, Error, MultiDistance, Radius, MultiRadius, MatchClose |
11 | 11 | from pyzipcodeapi.enums import FormatEnum, UnitEnum, CountryEnum |
12 | 12 | from pyzipcodeapi.options import OPTIONS |
13 | 13 |
|
@@ -143,14 +143,19 @@ def _post(self, option: str, path: str, data: dict): |
143 | 143 |
|
144 | 144 | def parse_response( |
145 | 145 | self, data_class: type | None = None |
146 | | - ) -> DictReader | bytes | type | Element | Error: |
| 146 | + ) -> DictReader | bytes | type | Element | Error | list[type]: |
147 | 147 | response = self.con.getresponse() |
148 | 148 | success = response.status == 200 |
149 | 149 | data = response.read() |
150 | 150 | if self.format == FormatEnum.JSON: |
151 | 151 | data = loads(data) |
152 | 152 | if success: |
153 | | - return data_class(**data) if data_class else data |
| 153 | + if data_class: |
| 154 | + if type(data) == dict: |
| 155 | + return data_class(**data) |
| 156 | + if type(data) == list: |
| 157 | + return [data_class(**d) for d in data] |
| 158 | + return data |
154 | 159 | return Error(**data) |
155 | 160 | elif self.format == FormatEnum.CSV: |
156 | 161 | return DictReader(StringIO(data.decode()), delimiter=",") |
@@ -207,3 +212,10 @@ def multi_radius( |
207 | 212 | body["addrs"] = "\n".join(addresses) |
208 | 213 | self._post("multi-radius", f"{distance}/{units}", data=body) |
209 | 214 | return self.parse_response(data_class=MultiRadius) |
| 215 | + |
| 216 | + def match_close( |
| 217 | + self, zip_codes: list[str], distance: int, units: UnitEnum = UnitEnum.KM |
| 218 | + ) -> list[MatchClose] | DictReader | Element: |
| 219 | + """match-close.<format>/<zip_codes>/<distance>/<units>""" |
| 220 | + self._get("match-close", f"{','.join(zip_codes)}/{distance}/{units}") |
| 221 | + return self.parse_response(data_class=MatchClose) |
0 commit comments