#pragma once namespace lidarlib { // Result of open() and the sticky status behind last_error(). Ok == 0 so // `if (err != ErrorCode::Ok)` reads naturally at call sites. enum class ErrorCode { Ok = 0, // Lifecycle misuse — the call was refused, the instance state is unchanged. AlreadyOpen, // open() called while already open NotOpen, // recv_scan()/spin_once() called before open() // open() failures SocketError, // socket() creation failed InvalidAddress, // ip string is not a valid IPv4 address PortInUse, // bind: local port already taken (EADDRINUSE/EACCES) BindFailed, // bind failed for another reason ConnectionRefused, // TCP connect refused (device up, port closed) ConnectionFailed, // TCP connect failed (unreachable, no route, ...) HandshakeFailed, // connected, but the start-stream command failed // Runtime failures Timeout, // no (complete) scan within timeout_ms DeviceDisconnected, // peer closed the connection / socket recv error }; inline const char* to_string(ErrorCode e) { switch (e) { case ErrorCode::Ok: return "Ok"; case ErrorCode::AlreadyOpen: return "AlreadyOpen"; case ErrorCode::NotOpen: return "NotOpen"; case ErrorCode::SocketError: return "SocketError"; case ErrorCode::InvalidAddress: return "InvalidAddress"; case ErrorCode::PortInUse: return "PortInUse"; case ErrorCode::BindFailed: return "BindFailed"; case ErrorCode::ConnectionRefused: return "ConnectionRefused"; case ErrorCode::ConnectionFailed: return "ConnectionFailed"; case ErrorCode::HandshakeFailed: return "HandshakeFailed"; case ErrorCode::Timeout: return "Timeout"; case ErrorCode::DeviceDisconnected: return "DeviceDisconnected"; } return "Unknown"; } } // namespace lidarlib