"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from decimal import Decimal
from typing import (
Any,
Dict,
get_type_hints,
List,
Optional,
Union,
get_args,
get_origin,
)
from pydantic import BaseModel
from pydantic.fields import FieldInfo
from .metadata import (
PathParamMetadata,
find_field_metadata,
)
from .values import (
_get_serialized_params,
_is_set,
_populate_from_globals,
_val_to_string,
)
def generate_url(
server_url: str,
path: str,
path_params: Any,
gbls: Optional[Any] = None,
) -> str:
path_param_values: Dict[str, str] = {}
globals_already_populated = _populate_path_params(
path_params, gbls, path_param_values, []
)
if _is_set(gbls):
_populate_path_params(gbls, None, path_param_values, globals_already_populated)
for key, value in path_param_values.items():
path = path.replace("{" + key + "}", value, 1)
return remove_suffix(server_url, "/") + path
def _populate_path_params(
path_params: Any,
gbls: Any,
path_param_values: Dict[str, str],
skip_fields: List[str],
) -> List[str]:
globals_already_populated: List[str] = []
if not isinstance(path_params, BaseModel):
return globals_already_populated
path_param_fields: Dict[str, FieldInfo] = path_params.__class__.model_fields
path_param_field_types = get_type_hints(path_params.__class__)
for name in path_param_fields:
if name in skip_fields:
continue
field = path_param_fields[name]
param_metadata = find_field_metadata(field, PathParamMetadata)
if param_metadata is None:
continue
param = getattr(path_params, name) if _is_set(path_params) else None
param, global_found = _populate_from_globals(
name, param, PathParamMetadata, gbls
)
if global_found:
globals_already_populated.append(name)
if not _is_set(param):
continue
f_name = field.alias if field.alias is not None else name
serialization = param_metadata.serialization
if serialization is not None:
serialized_params = _get_serialized_params(
param_metadata, f_name, param, path_param_field_types[name]
)
for key, value in serialized_params.items():
path_param_values[key] = value
else:
pp_vals: List[str] = []
if param_metadata.style == "simple":
if isinstance(param, List):
for pp_val in param:
if not _is_set(pp_val):
continue
pp_vals.append(_val_to_string(pp_val))
path_param_values[f_name] = ",".join(pp_vals)
elif isinstance(param, Dict):
for pp_key in param:
if not _is_set(param[pp_key]):
continue
if param_metadata.explode:
pp_vals.append(f"{pp_key}={_val_to_string(param[pp_key])}")
else:
pp_vals.append(f"{pp_key},{_val_to_string(param[pp_key])}")
path_param_values[f_name] = ",".join(pp_vals)
elif not isinstance(param, (str, int, float, complex, bool, Decimal)):
param_fields: Dict[str, FieldInfo] = param.__class__.model_fields
for name in param_fields:
param_field = param_fields[name]
param_value_metadata = find_field_metadata(
param_field, PathParamMetadata
)
if param_value_metadata is None:
continue
param_name = (
param_field.alias if param_field.alias is not None else name
)
param_field_val = getattr(param, name)
if not _is_set(param_field_val):
continue
if param_metadata.explode:
pp_vals.append(
f"{param_name}={_val_to_string(param_field_val)}"
)
else:
pp_vals.append(
f"{param_name},{_val_to_string(param_field_val)}"
)
path_param_values[f_name] = ",".join(pp_vals)
elif _is_set(param):
path_param_values[f_name] = _val_to_string(param)
return globals_already_populated
def is_optional(field):
return get_origin(field) is Union and type(None) in get_args(field)
def template_url(url_with_params: str, params: Dict[str, str]) -> str:
for key, value in params.items():
url_with_params = url_with_params.replace("{" + key + "}", value)
return url_with_params
def remove_suffix(input_string, suffix):
if suffix and input_string.endswith(suffix):
return input_string[: -len(suffix)]
return input_string