using RobotNet10.RobotApp.Shared; namespace RobotNet10.RobotApp.SLAM.Cartographer.Helpers; /// /// Shared helper for map name sanitization and legacy metadata migration. /// Used by CartographerService and MapSaveProcessor. /// public static class MapNameHelper { /// /// Sanitize map name for use as directory name. /// Removes invalid filename characters and trims spaces/dots. /// public static string Sanitize(string mapName) { if (string.IsNullOrWhiteSpace(mapName)) throw new ArgumentException("Map name cannot be null or empty", nameof(mapName)); var invalidChars = Path.GetInvalidFileNameChars(); var sanitized = mapName; foreach (var c in invalidChars) { sanitized = sanitized.Replace(c, '_'); } sanitized = sanitized.Trim(' ', '.'); if (string.IsNullOrWhiteSpace(sanitized)) throw new ArgumentException("Map name is invalid after sanitization", nameof(mapName)); return sanitized; } /// /// Ensures MapInfo has Size calculated from Bounds for legacy map.json files /// that don't have Size field populated. /// public static MapInfo EnsureMapSize(MapInfo metadata) { if (metadata.Size.Width == 0 && metadata.Size.Height == 0) { var width = metadata.Bounds.MaxX - metadata.Bounds.MinX; var height = metadata.Bounds.MaxY - metadata.Bounds.MinY; return new MapInfo { Name = metadata.Name, FolderPath = metadata.FolderPath, CreatedDate = metadata.CreatedDate, Resolution = metadata.Resolution, Size = new MapSize(width, height), Origin = metadata.Origin, Bounds = metadata.Bounds, TrajectoryNodeCount = metadata.TrajectoryNodeCount }; } return metadata; } }