# Copyright (c) 2023 Boston Dynamics, Inc. All rights reserved.
#
# Downloading, reproducing, distributing or otherwise using the SDK Software
# is subject to the terms and conditions of the Boston Dynamics Software
# Development Kit License (20191101-BDSDK-SL).
from builtins import str as text
from bosdyn.mission import util
[docs]class Error(Exception):
"""Base exception"""
[docs]class CompileError(Error):
"""Error occurred during compilation."""
def __init__(self, msg='', node_proto=None):
Error.__init__(self, msg)
self.node_proto = node_proto
[docs] def node_name(self):
"""Returns the 'name' field of the Node proto if possible, None otherwise"""
if self.node_proto is None:
return None
try:
return self.node_proto.name
except Exception:
return None
[docs] def node_impl(self):
"""Returns the proto type of the Node 'impl' field if possible, None otherwise"""
if self.node_proto is None:
return None
try:
return self.node_proto.impl.TypeName()
except Exception:
return None
[docs] def get_node_details(self):
"""Get a string of the node detail."""
details = ''
node_impl = self.node_impl()
if node_impl:
details = f' ({node_impl}'
node_name = self.node_name()
if node_name is not None:
if not details:
details = ' (???'
details += f' with name "{node_name}")'
return details
def __str__(self):
msg = super(CompileError, self).__str__()
return msg + self.get_node_details()
[docs]class UnknownType(CompileError):
def __str__(self):
return 'Do not know how to build {}'.format(self.node_impl())
[docs]class ValidationError(Error):
"""The mission encountered errors in the validate step.
Args:
tree: The root node of the compiled mission.
errors: List of ValidationErrorReport.
"""
def __init__(self, tree, errors):
self.tree = tree
self.errors = errors
def __str__(self):
return 'Encountered {} validation errors: \n\t{}'.format(
len(self.errors), '\n\t'.join([text(e) for e in self.errors]))
[docs]class MissingParameterError(CompileError):
"""Could not find a matching parameter.
Args:
target_name: Name of the parameter that was missing / mismatched.
target_pb_type: Desired type of the parameter. None if any type was acceptable.
stored_pb_type: Type of the parameter that was stored. None if type was unknown.
"""
def __init__(self, target_name, target_pb_type=None, stored_pb_type=None):
self.target_name = target_name
self.target_pb_type = target_pb_type
self.stored_pb_type = stored_pb_type
def __str__(self):
if self.target_pb_type != self.stored_pb_type:
return 'Mismatched type for "{}". Stored as {}, wanted {}'.format(
self.target_name, util.safe_pb_type_to_string(self.stored_pb_type),
util.safe_pb_type_to_string(self.target_pb_type))
return 'No parameter "{}"'.format(self.target_name)
[docs]class InaccessibleParameterError(MissingParameterError):
"""Could not read the parameter, though one was provided elsewhere."""
[docs]class MessageOverrideError(CompileError):
"""Failed to override a mission node's field with a Message type."""
def __init__(self, overriding_message, field_name, field_type):
self.overriding_message = overriding_message
self.field_name = field_name
self.field_type = field_type
def __str__(self):
return 'Override of type {} cannot be written to field "{}" of type {}'.format(
self.overriding_message.TypeName(), self.field_name, self.field_type)
[docs]class NodeUnreferenceableError(Error):
"""Node cannot be referenced."""