1use dynamics_model::model::ModelError;
4
5use std::{fmt::Display, io};
6
7#[derive(Debug)]
8pub enum ParseError {
10 IoError(io::Error, String),
12 XmlError(roxmltree::Error),
14 NoRobotTag,
16 VisualWithoutGeometry(String),
18 GeometryWithoutShape(String),
20 MissingParameter(String),
22 InvalidParameter(String),
24 NameMissing(String),
26 MaterialWithoutColor(String),
28 UnknownJointType(String),
30 UnknownTag(String),
32 ModelError(ModelError),
34 UnknownLinkName(String),
36 InvalidFilePath(String),
38 InertialWithoutInertia(String),
40 InertialWithoutMass(String),
42 UnknownParent(String),
44}
45
46impl Display for ParseError {
47 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
48 match self {
49 ParseError::IoError(e, path) => write!(f, "IO error: {e} (file: {path})"),
50 ParseError::XmlError(e) => write!(f, "XML parsing error: {e}"),
51 ParseError::NoRobotTag => write!(f, "No <robot> tag found in URDF."),
52 ParseError::VisualWithoutGeometry(visual) => {
53 write!(
54 f,
55 "the <visual> tag named '{visual}' does not have a corresponding <geometry> tag."
56 )
57 }
58 ParseError::GeometryWithoutShape(geometry) => {
59 write!(
60 f,
61 "the <geometry> tag named '{geometry}' does not have a corresponding shape tag."
62 )
63 }
64 ParseError::MissingParameter(param) => {
65 write!(f, "Missing required parameter: {param}")
66 }
67 ParseError::InvalidParameter(param) => {
68 write!(f, "Invalid value for parameter: {param}")
69 }
70 ParseError::NameMissing(entity) => write!(f, "Missing name attribute for {entity}."),
71 ParseError::MaterialWithoutColor(material) => {
72 write!(
73 f,
74 "the <material> tag named '{material}' does not have a corresponding <color> tag."
75 )
76 }
77 ParseError::UnknownJointType(joint_type) => {
78 write!(f, "unknown joint type ({joint_type}).")
79 }
80 ParseError::UnknownTag(tag) => write!(f, "Unknown tag encountered: {tag}"),
81 ParseError::ModelError(e) => write!(f, "Model error: {e}"),
82 ParseError::UnknownLinkName(name) => write!(f, "Unknown link name: {name}"),
83 ParseError::InvalidFilePath(path) => write!(f, "Invalid file path: {path}"),
84 ParseError::InertialWithoutInertia(link) => {
85 write!(f, "<inertial> tag in link '{link}' missing inertia data.")
86 }
87 ParseError::InertialWithoutMass(link) => {
88 write!(f, "<inertial> tag in link '{link}' missing mass data.")
89 }
90 ParseError::UnknownParent(parent) => {
91 write!(f, "Frame references unknown parent: {parent}")
92 }
93 }
94 }
95}