Strategy: Each API path names a type. When we try to construct them, we might find that they are concrete types that need to be created e.g. for path ApiPath(["paths", "/pets/{id}", "DELETE", "reponses", "default", "application/json"]) => struct PathPetIdDeleteResponseDefaultJson { sucess: bool } Or we might be able to simply alias the type to a known type // built-in type PathPetIdDeleteResponseDefaultJson = String // generated elsewhere type PathPetIdDeleteResponseDefaultJson = NewPet in any case, we always use the full name when creating our endpoint fn delete_pet() -> PathPetIdDeleteResponseDefaultJson; That way, we don't have to worry about chasing references around the place