This commit is contained in:
2025-11-14 17:27:44 +03:00
parent 1ea5fb623d
commit 9e8a7a62c9
5 changed files with 156 additions and 35 deletions

View File

@@ -509,6 +509,82 @@ static_assert(mcc_telemetry_data_c<MccTelemetryData>, "");
/* DEFAULT SERIALIZER/DESERIALIZER FOR COORDINATE-RELATED CLASSES */
enum class MccCoordinateConvErrorCode : int {
ERROR_OK,
ERROR_ARG_LEN,
ERROR_NONNUM_ARG,
ERROR_NONSGM_ARG,
ERROR_INVALID_CPAIR,
ERROR_TIMEPOINT,
ERROR_INVALID_COORD_FMT,
ERROR_INVALID_COORD_PREC
};
class MccCoordinateConvErrorCategory : public std::error_category
{
public:
const char* name() const noexcept
{
return "MCC-COORD-CONV";
}
std::string message(int ec) const
{
MccCoordinateConvErrorCode err = static_cast<MccCoordinateConvErrorCode>(ec);
switch (err) {
case MccCoordinateConvErrorCode::ERROR_OK:
return "OK";
case MccCoordinateConvErrorCode::ERROR_ARG_LEN:
return "invalid argument length or number of argument elements";
case MccCoordinateConvErrorCode::ERROR_NONNUM_ARG:
return "non-numeric or out-of-range argument";
case MccCoordinateConvErrorCode::ERROR_NONSGM_ARG:
return "non-sexagesimal argument";
case MccCoordinateConvErrorCode::ERROR_INVALID_CPAIR:
return "invalid coordinate pair name";
case MccCoordinateConvErrorCode::ERROR_TIMEPOINT:
return "invalid time point";
case MccCoordinateConvErrorCode::ERROR_INVALID_COORD_FMT:
return "invalid coordinate formatter string";
case MccCoordinateConvErrorCode::ERROR_INVALID_COORD_PREC:
return "invalid coordinate formatter precision string";
defaut:
return "unknown";
};
return "unknown";
}
static const MccCoordinateConvErrorCategory& get()
{
static const MccCoordinateConvErrorCategory constInst;
return constInst;
}
};
} // namespace mcc
namespace std
{
template <>
class is_error_code_enum<mcc::MccCoordinateConvErrorCode> : public true_type
{
};
} // namespace std
namespace mcc
{
inline std::error_code make_error_code(mcc::MccCoordinateConvErrorCode ec)
{
return std::error_code(static_cast<int>(ec), mcc::MccCoordinateConvErrorCategory::get());
}
static constexpr std::string_view MccCoordinateDefaultDelimiter{","};
// base class
@@ -572,7 +648,8 @@ protected:
bool ok = cep.fromCharRange(bytes);
if (!ok) {
return std::make_error_code(std::errc::invalid_argument);
// return std::make_error_code(std::errc::invalid_argument);
return MccCoordinateConvErrorCode::ERROR_TIMEPOINT;
}
mcc_tp2tp(cep.UTC(), cp.time_point);
@@ -588,7 +665,8 @@ protected:
if (ang) {
ang_value = MccAngle(ang.value(), MccDegreeTag{});
} else {
return std::make_error_code(std::errc::invalid_argument);
// return std::make_error_code(std::errc::invalid_argument);
return MccCoordinateConvErrorCode::ERROR_NONNUM_ARG;
}
return {};
@@ -602,7 +680,8 @@ protected:
if (ang) {
ang_value = MccAngle(ang.value(), MccDegreeTag{});
} else {
return std::make_error_code(std::errc::invalid_argument);
// return std::make_error_code(std::errc::invalid_argument);
return MccCoordinateConvErrorCode::ERROR_NONNUM_ARG;
}
return {};
@@ -761,7 +840,8 @@ public:
auto els = splitToElements(std::forward<IR>(bytes));
if (els.size() < 2) { // at least coordinate pair must be given
return std::make_error_code(std::errc::invalid_argument);
// return std::make_error_code(std::errc::invalid_argument);
return MccCoordinateConvErrorCode::ERROR_ARG_LEN;
}
MccCelestialPoint pt{.pair_kind = MccCoordPairKind::COORDS_KIND_RADEC_ICRS};
@@ -769,7 +849,8 @@ public:
if (els.size() > 2) { // pair of coordinates and the pair kind
pt.pair_kind = MccCoordStrToPairKind(els[2]);
if (pt.pair_kind == MccCoordPairKind::COORDS_KIND_UNKNOWN) {
return std::make_error_code(std::errc::invalid_argument);
// return std::make_error_code(std::errc::invalid_argument);
return MccCoordinateConvErrorCode::ERROR_INVALID_CPAIR;
}
}
@@ -804,12 +885,14 @@ public:
ang1 = mcc::utils::parsAngleString(els[0]);
}
if (!ang1) {
return std::make_error_code(std::errc::invalid_argument);
// return std::make_error_code(std::errc::invalid_argument);
return MccCoordinateConvErrorCode::ERROR_NONNUM_ARG;
}
ang2 = mcc::utils::parsAngleString(els[1]);
if (!ang2) {
return std::make_error_code(std::errc::invalid_argument);
// return std::make_error_code(std::errc::invalid_argument);
return MccCoordinateConvErrorCode::ERROR_NONNUM_ARG;
}
@@ -886,13 +969,15 @@ public:
auto els = splitToElements(std::forward<IR>(bytes));
if (els.size() < 10) {
return std::make_error_code(std::errc::invalid_argument);
// return std::make_error_code(std::errc::invalid_argument);
return MccCoordinateConvErrorCode::ERROR_ARG_LEN;
}
MccEqtHrzCoords pt;
pt.pair_kind = MccCoordStrToPairKind(els[8]);
if (pt.pair_kind == MccCoordPairKind::COORDS_KIND_UNKNOWN) {
return std::make_error_code(std::errc::invalid_argument);
// return std::make_error_code(std::errc::invalid_argument);
return MccCoordinateConvErrorCode::ERROR_INVALID_CPAIR;
}
auto err = parseTimePoint(els[9], pt);
@@ -999,7 +1084,8 @@ public:
auto els = splitToElements(std::forward<IR>(bytes));
if (els.size() < 12) {
return std::make_error_code(std::errc::invalid_argument);
// return std::make_error_code(std::errc::invalid_argument);
return MccCoordinateConvErrorCode::ERROR_ARG_LEN;
}
MccPointingTarget pt;
@@ -1068,7 +1154,8 @@ public:
auto els = splitToElements(std::forward<IR>(bytes));
if (els.size() < 12) {
return std::make_error_code(std::errc::invalid_argument);
// return std::make_error_code(std::errc::invalid_argument);
return MccCoordinateConvErrorCode::ERROR_ARG_LEN;
}
MccTelemetryData tdata;