use super::{Actor, ActorBase};
use crate::{error::ffi::with_ffi_error, geom::BoundingBox, road::SignId};
use carla_sys::carla_rust::client::{FfiActor, FfiTrafficSign};
use cxx::SharedPtr;
use derivative::Derivative;
use static_assertions::assert_impl_all;
#[derive(Clone, Derivative)]
#[derivative(Debug)]
pub struct TrafficSign {
#[derivative(Debug = "ignore")]
inner: SharedPtr<FfiTrafficSign>,
}
impl TrafficSign {
pub fn sign_id(&self) -> crate::Result<SignId> {
let id = with_ffi_error("sign_id", |e| self.inner.GetSignId(e))?;
Ok(id.to_string())
}
pub fn trigger_volume(&self) -> crate::Result<BoundingBox> {
let bbox = with_ffi_error("trigger_volume", |e| self.inner.GetTriggerVolume(e))?;
Ok(BoundingBox::from_native(&bbox))
}
fn from_cxx(ptr: SharedPtr<FfiTrafficSign>) -> Option<Self> {
if ptr.is_null() {
None
} else {
Some(Self { inner: ptr })
}
}
}
impl ActorBase for TrafficSign {
fn cxx_actor(&self) -> SharedPtr<FfiActor> {
self.inner.to_actor()
}
}
impl TryFrom<Actor> for TrafficSign {
type Error = Actor;
fn try_from(value: Actor) -> Result<Self, Self::Error> {
let ptr = value.inner.to_traffic_sign();
Self::from_cxx(ptr).ok_or(value)
}
}
assert_impl_all!(TrafficSign: Send, Sync);