using System.Text.Json; using System.Text.Json.Serialization; using View_by_Distance.Shared.Models.Stateless.Methods; namespace View_by_Distance.Shared.Models; public record FilePath(long CreationTicks, string DirectoryName, string ExtensionLowered, string FileNameFirstSegment, string FullName, int? Id, bool IsIntelligentIdFormat, long LastWriteTicks, long Length, string Name, string NameWithoutExtension, int? SortOrder) { public override string ToString() { string result = JsonSerializer.Serialize(this, FilePathSourceGenerationContext.Default.FilePath); return result; } public static FilePath Get(MetadataConfiguration metadataConfiguration, FileHolder fileHolder, int? index) { if (fileHolder.CreationTime is null) throw new NullReferenceException(nameof(fileHolder.CreationTime)); if (fileHolder.LastWriteTime is null) throw new NullReferenceException(nameof(fileHolder.LastWriteTime)); if (fileHolder.Length is null) throw new NullReferenceException(nameof(fileHolder.Length)); FilePath result; int? id; int? sortOder; string fileNameFirstSegment = fileHolder.Name.Split('.')[0]; int sortOrderOnlyLengthIndex = metadataConfiguration.Offset.ToString().Length; string fileDirectoryName = fileHolder.DirectoryName ?? throw new NullReferenceException(); bool fileNameFirstSegmentIsIntelligentIdFormat = IId.NameWithoutExtensionIsIntelligentIdFormat(metadataConfiguration, fileNameFirstSegment); bool fileNameFirstSegmentIsPaddedIntelligentIdFormat = IId.NameWithoutExtensionIsPaddedIntelligentIdFormat(metadataConfiguration, sortOrderOnlyLengthIndex, fileNameFirstSegment); bool fileNameFirstSegmentIsIdFormat = !fileNameFirstSegmentIsPaddedIntelligentIdFormat && !fileNameFirstSegmentIsIntelligentIdFormat && IId.NameWithoutExtensionIsIdFormat(metadataConfiguration, fileHolder); if (!fileNameFirstSegmentIsIdFormat && !fileNameFirstSegmentIsIntelligentIdFormat && !fileNameFirstSegmentIsPaddedIntelligentIdFormat) (id, sortOder) = (null, null); else if (fileNameFirstSegmentIsIntelligentIdFormat) (id, sortOder) = (IId.GetId(metadataConfiguration, fileNameFirstSegment), null); else if (fileNameFirstSegmentIsPaddedIntelligentIdFormat) { if (!int.TryParse(fileNameFirstSegment[..sortOrderOnlyLengthIndex], out int absoluteValueOfSortOrder)) (id, sortOder) = (null, null); else (id, sortOder) = (IId.GetId(metadataConfiguration, fileNameFirstSegment[sortOrderOnlyLengthIndex..]), absoluteValueOfSortOrder); } else if (fileNameFirstSegmentIsIdFormat) { if (index is null) throw new NullReferenceException(nameof(index)); if (!int.TryParse(fileNameFirstSegment, out int valueOfFileNameFirstSegment)) throw new NotSupportedException(); (id, sortOder) = (valueOfFileNameFirstSegment, metadataConfiguration.Offset + index); } else throw new NotSupportedException(); result = new(fileHolder.CreationTime.Value.Ticks, fileDirectoryName, fileHolder.ExtensionLowered, fileNameFirstSegment, fileHolder.FullName, id, fileNameFirstSegmentIsIntelligentIdFormat, fileHolder.LastWriteTime.Value.Ticks, fileHolder.Length.Value, fileHolder.Name, fileHolder.NameWithoutExtension, sortOder); return result; } } [JsonSourceGenerationOptions(WriteIndented = true)] [JsonSerializable(typeof(FilePath))] public partial class FilePathSourceGenerationContext : JsonSerializerContext { }