using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Contracts; using ToolkitPathUtilities = StardewModdingAPI.Toolkit.Utilities.PathUtilities; namespace StardewModdingAPI.Utilities { /// Provides utilities for normalizing file paths. public static class PathUtilities { /********* ** Accessors *********/ /// The preferred directory separator character in an asset key. public static char PreferredAssetSeparator { get; } = ToolkitPathUtilities.PreferredAssetSeparator; /********* ** Public methods *********/ /// Get the segments from a path (e.g. /usr/bin/example => usr, bin, and example). /// The path to split. /// The number of segments to match. Any additional segments will be merged into the last returned part. [Pure] public static string[] GetSegments(string? path, int? limit = null) { return ToolkitPathUtilities.GetSegments(path, limit); } /// Normalize an asset name to match how MonoGame's content APIs would normalize and cache it. /// The asset name to normalize. [Pure] [return: NotNullIfNotNull("assetName")] public static string? NormalizeAssetName(string? assetName) { return ToolkitPathUtilities.NormalizeAssetName(assetName); } /// Normalize separators in a file path for the current platform. /// The file path to normalize. /// This should only be used for file paths. For asset names, use instead. [Pure] [return: NotNullIfNotNull("path")] public static string? NormalizePath(string? path) { return ToolkitPathUtilities.NormalizePath(path); } /// Get whether a path is relative and doesn't try to climb out of its containing folder (e.g. doesn't contain ../). /// The path to check. [Pure] public static bool IsSafeRelativePath(string? path) { return ToolkitPathUtilities.IsSafeRelativePath(path); } /// Get whether a string is a valid 'slug', containing only basic characters that are safe in all contexts (e.g. filenames, URLs, etc). /// The string to check. [Pure] public static bool IsSlug(string? str) { return ToolkitPathUtilities.IsSlug(str); } } }