Files
plexpy/src/plexsdk/net/query_serializer.py
2023-10-26 21:45:48 -05:00

75 lines
2.3 KiB
Python

from typing import Any, Dict, List
from enum import Enum
explode = bool
def simple(value: Any, explode: bool) -> str:
if isinstance(value, Enum):
return str(value.value)
# Check if the value is a list
if isinstance(value, list):
return ",".join(value) if explode else "".join(value)
if isinstance(value, dict):
if explode:
# Serialize object with exploded format: "key=value,key2=value2"
return ",".join([f"{k}={v}" for k, v in value.items()])
else:
# Serialize object with non-exploded format: "key,value,key2,value2"
return ",".join(
[str(item) for sublist in value.items() for item in sublist]
)
return str(value)
def form(parameter_name: str, parameter_value: Any, explode: bool) -> str:
if isinstance(parameter_value, Enum):
return f"{parameter_name}=" + str(parameter_value.value)
if isinstance(parameter_value, list):
return (
"&".join([f"{parameter_name}={v}" for v in parameter_value])
if explode
else f"{parameter_name}=" + ",".join([str(v) for v in parameter_value])
)
if isinstance(parameter_value, dict):
if explode:
# Serialize object with exploded format: "key1=value1&key2=value2"
return "&".join([f"{k}={v}" for k, v in parameter_value.items()])
else:
# Serialize object with non-exploded format: "key=key1,value1,key2,value2"
return f"{parameter_name}=" + ",".join(
[str(item) for sublist in parameter_value.items() for item in sublist]
)
return f"{parameter_name}=" + str(parameter_value)
style_methods = {
"simple": simple,
"form": form,
}
def serialize_query(parameter_style, explode, key: str, parameter_value: Any) -> str:
method = style_methods.get(parameter_style)
return method(key, parameter_value, explode) if method else ""
def serialize_path(
parameter_style, explode: bool, parameter_value: Any, parameter_key=None
):
method = style_methods.get(parameter_style)
if not method:
return ""
# The `simple` and `label` styles do not require a `parameter_key`
if not parameter_key:
return method(parameter_value, explode)
else:
return method(parameter_key, parameter_value, explode)