use soap_server::fault::SoapFault;
#[derive(Debug, thiserror::Error)]
pub enum OnvifError {
#[error("Action not implemented")]
NotImplemented,
#[error("Invalid argument: {0}")]
InvalidArgument(String),
#[error("Action not supported")]
ActionNotSupported,
}
impl OnvifError {
pub fn into_soap_fault(self) -> SoapFault {
match self {
OnvifError::NotImplemented | OnvifError::ActionNotSupported => {
let subcode = "ter:ActionNotSupported";
let detail = format!(
r#"<ter:fault xmlns:ter="http://www.onvif.org/ver10/error"><ter:subcode>{subcode}</ter:subcode></ter:fault>"#
);
SoapFault::receiver("Action not supported").with_detail_xml(detail)
}
OnvifError::InvalidArgument(msg) => {
let subcode = "ter:InvalidArgVal";
let detail = format!(
r#"<ter:fault xmlns:ter="http://www.onvif.org/ver10/error"><ter:subcode>{subcode}</ter:subcode></ter:fault>"#
);
SoapFault::sender(msg).with_detail_xml(detail)
}
}
}
}
pub fn not_implemented<T>() -> Result<T, OnvifError> {
Err(OnvifError::NotImplemented)
}