blob: 37c2989dd3dca0b0db4ab7a40d226426c601dcbb [file] [log] [blame]
#include <BaSyx/vab/backend/connector/native/frame/EntityWrapper.h>
using basyx::vab::EntityWrapper;
namespace {
std::string prepareErrorCode(basyx::object::error errorCode)
{
std::string error;
switch (errorCode)
{
case basyx::object::error::PropertyNotFound:
error = "ResourceNotFoundException";
break;
case basyx::object::error::ObjectAlreadyExists:
error = "ResourceAlreadyExistsException";
break;
case basyx::object::error::MalformedRequest:
error = "MalformedRequestException";
break;
default:
error = "ProviderException";
break;
};
return error;
};
std::string prepareErrorMessage(basyx::object::error errorCode, const std::string & message)
{
return prepareErrorCode(errorCode) + ": " + message;
};
}
basyx::object build_exception(const std::string & type, const std::string & message)
{
basyx::object::error error = basyx::object::error::ProviderException;
if (type == "ResourceNotFoundException")
{
error = basyx::object::error::PropertyNotFound;
}
else if (type == "ResourceAlreadyExistsException")
{
error = basyx::object::error::ObjectAlreadyExists;
}
else if (type == "MalformedRequestException")
{
error = basyx::object::error::MalformedRequest;
}
else if (type == "ProviderException")
{
error = basyx::object::error::ProviderException;
};
return basyx::object::make_error(error, message);
};
basyx::json_t EntityWrapper::build_from_error(basyx::object::error error, const std::string & message)
{
json_t msg;
msg["messageType"] = 6;
msg["text"] = prepareErrorMessage(error, message);
msg["code"] = nullptr;
basyx::json_t j_obj;
j_obj["success"] = false;
j_obj["isException"] = true;
j_obj["messages"] = json_t::array({ msg });
j_obj["entityType"] = prepareErrorCode(error);
return j_obj;
};
basyx::json_t EntityWrapper::build_from_object(const basyx::object & object)
{
basyx::json_t j_obj;
if (object.IsError())
{
return build_from_error(object.getError(), object.getErrorMessage());
}
else
{
j_obj["success"] = true;
// j_obj["isException"] = false;
j_obj["entityType"] = "entity";
j_obj["entity"] = basyx::serialization::json::serialize(object);
}
return j_obj;
};
basyx::object EntityWrapper::from_json(const basyx::json_t & json)
{
bool success = json["success"];
// everyhing okay, deserialize entity
if (success)
{
if (json.contains("entity"))
return basyx::serialization::json::deserialize(json["entity"]);
else
return basyx::object::make_null();
}
// something went wrong, check for exception
else if (json.contains("isException") && json.contains("messages"))
{
return build_exception(json["entityType"], json["messages"][0]["text"]);
}
// error and no exception; create one
else
{
return basyx::object::make_error(basyx::object::error::MalformedRequest);
};
};