use super::{Actor, ActorBase};
use crate::{error::ffi::with_ffi_error, geom::Location};
use carla_sys::carla_rust::client::{FfiActor, FfiWalkerAIController};
use cxx::SharedPtr;
use derivative::Derivative;
#[cfg_attr(carla_version_0916, doc = "")]
#[cfg_attr(
carla_version_0916,
doc = " [`carla.WalkerAIController`]: https://carla.readthedocs.io/en/0.9.16/python_api/#carla.WalkerAIController"
)]
#[cfg_attr(carla_version_0915, doc = "")]
#[cfg_attr(
carla_version_0915,
doc = " [`carla.WalkerAIController`]: https://carla.readthedocs.io/en/0.9.15/python_api/#carla.WalkerAIController"
)]
#[cfg_attr(carla_version_0914, doc = "")]
#[cfg_attr(
carla_version_0914,
doc = " [`carla.WalkerAIController`]: https://carla.readthedocs.io/en/0.9.14/python_api/#carla.WalkerAIController"
)]
#[derive(Clone, Derivative)]
#[derivative(Debug)]
#[repr(transparent)]
pub struct WalkerAIController {
#[derivative(Debug = "ignore")]
inner: SharedPtr<FfiWalkerAIController>,
}
impl WalkerAIController {
#[cfg_attr(
carla_version_0916,
doc = " See [carla.WalkerAIController.start](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.WalkerAIController.start)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.WalkerAIController.start](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.WalkerAIController.start)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.WalkerAIController.start](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.WalkerAIController.start)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn start(&self) -> crate::Result<()> {
with_ffi_error("start", |e| {
self.inner.Start(e);
})
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.WalkerAIController.stop](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.WalkerAIController.stop)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.WalkerAIController.stop](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.WalkerAIController.stop)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.WalkerAIController.stop](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.WalkerAIController.stop)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn stop(&self) -> crate::Result<()> {
with_ffi_error("stop", |e| {
self.inner.Stop(e);
})
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.WalkerAIController.get_random_location](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.WalkerAIController.get_random_location)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.WalkerAIController.get_random_location](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.WalkerAIController.get_random_location)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.WalkerAIController.get_random_location](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.WalkerAIController.get_random_location)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn get_random_location(&self) -> crate::Result<Option<Location>> {
let ptr = with_ffi_error("get_random_location", |e| self.inner.GetRandomLocation(e))?;
if ptr.is_null() {
Ok(None)
} else {
Ok(Some(Location::from_ffi(ptr.as_ref().unwrap().clone())))
}
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.WalkerAIController.go_to_location](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.WalkerAIController.go_to_location)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.WalkerAIController.go_to_location](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.WalkerAIController.go_to_location)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.WalkerAIController.go_to_location](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.WalkerAIController.go_to_location)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn go_to_location(&self, location: &Location) -> crate::Result<()> {
with_ffi_error("go_to_location", |e| {
self.inner.GoToLocation(location.as_ffi(), e);
})
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.WalkerAIController.set_max_speed](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.WalkerAIController.set_max_speed)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.WalkerAIController.set_max_speed](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.WalkerAIController.set_max_speed)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.WalkerAIController.set_max_speed](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.WalkerAIController.set_max_speed)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn set_max_speed(&self, speed: f32) -> crate::Result<()> {
with_ffi_error("set_max_speed", |e| {
self.inner.SetMaxSpeed(speed, e);
})
}
#[allow(dead_code)]
pub(crate) fn from_cxx(ptr: SharedPtr<FfiWalkerAIController>) -> Option<Self> {
if ptr.is_null() {
None
} else {
Some(Self { inner: ptr })
}
}
#[allow(dead_code)]
pub(crate) fn cxx_walker_ai_controller(&self) -> SharedPtr<FfiWalkerAIController> {
self.inner.clone()
}
}
impl ActorBase for WalkerAIController {
fn cxx_actor(&self) -> SharedPtr<FfiActor> {
unsafe { std::mem::transmute(self.inner.clone()) }
}
}
impl TryFrom<Actor> for WalkerAIController {
type Error = Actor;
fn try_from(actor: Actor) -> Result<Self, Self::Error> {
let controller_ptr: SharedPtr<FfiWalkerAIController> =
unsafe { std::mem::transmute(actor.inner.clone()) };
if actor.type_id().contains("controller.ai.walker") {
Ok(WalkerAIController {
inner: controller_ptr,
})
} else {
Err(actor)
}
}
}