#pragma once

#include <string>

namespace rm_control::common {

// 工程内部统一返回类型：
// - ok=true 表示调用成功，value 存放结果；
// - ok=false 表示调用失败，error_message 存放可打印的错误原因。
// 这样上层不用混用异常、错误码和 bool，便于测试和排查硬件调用失败。
template <typename T>
struct Result {
    bool ok = false;
    T value{};
    std::string error_message;

    static Result<T> success(const T &value) {
        return Result<T>{true, value, ""};
    }

    static Result<T> failure(const std::string &message) {
        return Result<T>{false, T{}, message};
    }
};

// void 特化用于“只关心成功/失败、不需要返回值”的动作类接口，
// 例如 connect、moveJ、moveL。
template <>
struct Result<void> {
    bool ok = false;
    std::string error_message;

    static Result<void> success() {
        return Result<void>{true, ""};
    }

    static Result<void> failure(const std::string &message) {
        return Result<void>{false, message};
    }
};

} // namespace rm_control::common
