(
self,
key: str,
value: Data,
opts: Options,
)
| 63 | return flatten([self._stringify_item(key, value, opts) for key, value in params.items()]) |
| 64 | |
| 65 | def _stringify_item( |
| 66 | self, |
| 67 | key: str, |
| 68 | value: Data, |
| 69 | opts: Options, |
| 70 | ) -> list[tuple[str, str]]: |
| 71 | if isinstance(value, Mapping): |
| 72 | items: list[tuple[str, str]] = [] |
| 73 | nested_format = opts.nested_format |
| 74 | for subkey, subvalue in value.items(): |
| 75 | items.extend( |
| 76 | self._stringify_item( |
| 77 | # TODO: error if unknown format |
| 78 | f"{key}.{subkey}" if nested_format == "dots" else f"{key}[{subkey}]", |
| 79 | subvalue, |
| 80 | opts, |
| 81 | ) |
| 82 | ) |
| 83 | return items |
| 84 | |
| 85 | if isinstance(value, (list, tuple)): |
| 86 | array_format = opts.array_format |
| 87 | if array_format == "comma": |
| 88 | return [ |
| 89 | ( |
| 90 | key, |
| 91 | ",".join(self._primitive_value_to_str(item) for item in value if item is not None), |
| 92 | ), |
| 93 | ] |
| 94 | elif array_format == "repeat": |
| 95 | items = [] |
| 96 | for item in value: |
| 97 | items.extend(self._stringify_item(key, item, opts)) |
| 98 | return items |
| 99 | elif array_format == "indices": |
| 100 | items = [] |
| 101 | for i, item in enumerate(value): |
| 102 | items.extend(self._stringify_item(f"{key}[{i}]", item, opts)) |
| 103 | return items |
| 104 | elif array_format == "brackets": |
| 105 | items = [] |
| 106 | key = key + "[]" |
| 107 | for item in value: |
| 108 | items.extend(self._stringify_item(key, item, opts)) |
| 109 | return items |
| 110 | else: |
| 111 | raise NotImplementedError( |
| 112 | f"Unknown array_format value: {array_format}, choose from {', '.join(get_args(ArrayFormat))}" |
| 113 | ) |
| 114 | |
| 115 | serialised = self._primitive_value_to_str(value) |
| 116 | if not serialised: |
| 117 | return [] |
| 118 | return [(key, serialised)] |
| 119 | |
| 120 | def _primitive_value_to_str(self, value: PrimitiveData) -> str: |
| 121 | # copied from httpx |
no test coverage detected