using DeepDrftContent.FileDatabase.Utils;
namespace DeepDrftContent.FileDatabase.Models;
///
/// Base class for index data used in serialization
///
public abstract class IndexData
{
public string IndexKey { get; }
protected IndexData(string indexKey)
{
IndexKey = indexKey;
}
}
///
/// Serializable data for directory indexes
///
public class DirectoryIndexData : IndexData
{
public List Entries { get; set; } = new();
public DirectoryIndexData(string indexKey) : base(indexKey) { }
public static DirectoryIndexData FromIndex(DirectoryIndex index)
{
var data = new DirectoryIndexData(index.GetKey())
{
Entries = index.GetEntries().ToList()
};
return data;
}
}
///
/// Entry data for vault index serialization
///
public class VaultEntryData
{
public EntryKey Key { get; set; } = null!;
public MetaData Value { get; set; } = null!;
}
///
/// Serializable data for vault indexes
///
public class VaultIndexData : IndexData
{
public List Entries { get; set; } = new();
public VaultIndexData(string indexKey) : base(indexKey) { }
public static VaultIndexData FromIndex(VaultIndex index)
{
var data = new VaultIndexData(index.GetKey())
{
Entries = index.Entries.Select(kvp => new VaultEntryData { Key = kvp.Key, Value = kvp.Value }).ToList()
};
return data;
}
}
///
/// Directory index implementation using StructuralSet for entries
///
public class DirectoryIndex : IndexData, IDirectoryIndex
{
public StructuralSet Entries { get; }
public DirectoryIndex(DirectoryIndexData indexData) : base(indexData.IndexKey)
{
Entries = new StructuralSet();
// Load entries from data
foreach (var entry in indexData.Entries)
{
Entries.Add(entry);
}
}
public string GetKey() => IndexKey;
public IReadOnlyList GetEntries() => Entries.ToList().AsReadOnly();
public int GetEntriesSize() => Entries.Size;
public bool HasEntry(EntryKey entryKey) => Entries.Has(entryKey);
public void PutEntry(EntryKey entryKey) => Entries.Add(entryKey);
}
///
/// Vault index implementation using StructuralMap for entries with metadata
///
public class VaultIndex : IndexData, IVaultIndex
{
public StructuralMap Entries { get; }
public VaultIndex(VaultIndexData indexData) : base(indexData.IndexKey)
{
Entries = new StructuralMap();
// Load entries from data
foreach (var entry in indexData.Entries)
{
Entries.Set(entry.Key, entry.Value);
}
}
public string GetKey() => IndexKey;
public IReadOnlyList GetEntries() => Entries.Keys.ToList().AsReadOnly();
public int GetEntriesSize() => Entries.Size;
public bool HasEntry(EntryKey entryKey) => Entries.Has(entryKey);
public MetaData? GetEntry(EntryKey entryKey) => Entries.Get(entryKey);
public void PutEntry(EntryKey entryKey, MetaData metaData) => Entries.Set(entryKey, metaData);
}