#include "scan_log.h" namespace roro::scanlog { std::string csvField(const std::string& value) { bool needsQuote = false; for (char c : value) if (c == ',' || c == '"' || c == '\n' || c == '\r') needsQuote = true; if (!needsQuote) return value; std::string out = "\""; for (char c : value) { if (c == '"') out += '"'; // escape by doubling out += c; } out += '"'; return out; } std::string header() { return "time,bssid,channel,rssi,security,ssid"; } std::string row(const std::string& timestamp, const ScanEntry& ap) { return csvField(timestamp) + "," + csvField(ap.bssid) + "," + std::to_string(ap.channel) + "," + std::to_string(ap.rssi) + "," + csvField(ap.security) + "," + csvField(ap.ssid.empty() ? "(hidden)" : ap.ssid); } } // namespace roro::scanlog