342 {
343 std::error_code ec;
344 fs::create_directories(dir, ec);
345 if (ec) return false;
346 auto safe_name = rule.name;
347 for (char& c : safe_name) if (!(std::isalnum(static_cast<unsigned char>(c)) || c == '-' || c == '_' || c == '.')) c = '_';
348 const auto path = fs::path(dir) / (safe_name + ".json");
349 json j{{
"created", rule.created}, {
"name", rule.name}, {
"description", rule.description}, {
"enabled", rule.enabled},
350 {"precedence", rule.precedence}, {"nolog", rule.nolog}, {"action", rule.action}, {"duration", rule.duration},
352 std::ofstream out(path);
353 if (!out) return false;
354 out << j.dump(2) << '\n';
355 return true;
356}
json to_json_op(const Operator &op)