using System; namespace GitConverter.Lib.Models { /// /// Helper methods for working with . /// /// /// Responsibilities /// - Provide the canonical dot-prefixed filename extension for a given /// via . /// - Resolve common user-facing converter option strings to values /// via (case-insensitive). /// /// Recommended usage pattern (converters & callers) /// 1. Map the requested target option to the enum: /// var fe = FileExtensionHelpers.FromOption(optionString); /// 2. Obtain the suffix: /// var suffix = fe.HasValue ? fe.Value.ToDotExtension() : FileExtension.Csv.ToDotExtension(); /// 3. Compose a deterministic output filename: /// var outPath = Path.Combine(outputFolder, $"output_{timestamp}{suffix}"); /// /// Why this pattern /// - It centralizes filename-suffix decisions so changing a canonical extension (for example /// switching FileGdb to use ".gdb") only needs one code change. /// - It reduces accidental inconsistencies and makes tests and documentation easier to keep in sync. /// /// Behavior & guarantees /// - The mapping implemented by is the single source /// of truth for file suffixes used by converters when composing output file names. /// - Helpers are pure, stateless and thread-safe. /// /// Testing guidance /// - Add unit tests that assert: /// - Each enum member returns the expected dot-prefixed extension from . /// - recognizes common option strings case-insensitively and returns null for unknown strings. /// public static class FileExtensionHelpers { public static string ToDotExtension(this FileExtension ext) { switch (ext) { case FileExtension.Csv: return ".csv"; case FileExtension.EsriJson: return ".json"; case FileExtension.FileGdb: return ".gdb"; case FileExtension.GeoJson: return ".json"; case FileExtension.GeoJsonSeq: return ".json"; case FileExtension.GeoPackage: return ".gpkg"; case FileExtension.Gml: return ".gml"; case FileExtension.Gpx: return ".gpx"; case FileExtension.Kml: return ".kml"; case FileExtension.Kmz: return ".kmz"; case FileExtension.MapInfoInterchange: return ".mif"; case FileExtension.MapInfoTab: return ".tab"; case FileExtension.Osm: return ".osm"; case FileExtension.Shapefile: return ".shp"; case FileExtension.TopoJson: return ".json"; default: return string.Empty; } } public static FileExtension? FromOption(string option) { if (string.IsNullOrWhiteSpace(option)) return null; switch (option.Trim().ToLowerInvariant()) { case "csv": return FileExtension.Csv; case "esrijson": return FileExtension.EsriJson; case "gdb": case "gdbtable": case "gdbtablx": return FileExtension.FileGdb; case "geojson": return FileExtension.GeoJson; case "jsonl": case "ndjson": return FileExtension.GeoJsonSeq; case "gpkg": return FileExtension.GeoPackage; case "gml": return FileExtension.Gml; case "gpx": return FileExtension.Gpx; case "kml": return FileExtension.Kml; case "kmz": return FileExtension.Kmz; case "mif": case "mid": return FileExtension.MapInfoInterchange; case "tab": case "dat": case "map": case "id": return FileExtension.MapInfoTab; case "osm": return FileExtension.Osm; case "shp": case "shx": case "dbf": return FileExtension.Shapefile; case "topojson": return FileExtension.TopoJson; default: return null; } } } }