using System.Text.Json;
using XFEExtension.NetCore.FormatExtension;
namespace XFEExtension.NetCore.ProfileExtension;
///
/// XFE配置文件,实现配置文件读写自动化
///
public abstract class XFEProfile
{
private static Func SaveProfilesFunc { get; set; } = p => JsonSerializer.Serialize(p.Property.GetValue(null));
private static Func LoadProfilesFunc { get; set; } = (x, p) => JsonSerializer.Deserialize(x, p.Property.PropertyType);
///
/// 配置文件清单
///
public static List Profiles { get; private set; } = [];
///
/// 配置文件所在的根目录
///
public static string ProfilesRootPath { get; set; } = $"{AppDomain.CurrentDomain.BaseDirectory}/Profiles";
///
/// 加载配置文件
///
///
///
public static void LoadProfiles(params ProfileInfo[] profileInfo)
{
Profiles.AddRange(profileInfo);
foreach (var profile in Profiles)
{
if (!File.Exists(profile.Path))
continue;
XFEDictionary propertyFileContent = File.ReadAllText(profile.Path);
for (int i = 0; i < profile.PropertiesInfo.Count; i++)
{
for (int j = 0; j < propertyFileContent.Count; j++)
{
var propertyInfo = profile.PropertiesInfo[i];
var property = propertyFileContent.ElementAt(j);
if (property.Header == propertyInfo.Name)
{
profile.PropertiesInfo[i].Property.SetValue(null, LoadProfilesFunc(property.Content, propertyInfo));
continue;
}
foreach (var propertySecFind in propertyFileContent)
{
if (propertySecFind.Header == propertyInfo.Name)
{
profile.PropertiesInfo[i].Property.SetValue(null, LoadProfilesFunc(propertySecFind.Content, propertyInfo));
break;
}
}
}
}
}
}
///
/// 加载配置文件
///
///
///
public static async Task LoadProfilesAsync(params ProfileInfo[] profileInfo) => await Task.Run(() => LoadProfiles(profileInfo));
///
/// 储存指定的配置文件
///
/// 配置文件
///
public static void SaveProfile(ProfileInfo profileInfo)
{
var waitSaveProfile = Profiles.Find(x => x.Profile == profileInfo.Profile);
if (waitSaveProfile is null)
return;
var saveProfileDictionary = new XFEDictionary();
foreach (var property in waitSaveProfile.PropertiesInfo)
saveProfileDictionary.Add(property.Name, SaveProfilesFunc(property));
var fileSavePath = Path.GetDirectoryName(waitSaveProfile.Path);
if (!Directory.Exists(fileSavePath) && fileSavePath is not null && fileSavePath != string.Empty)
Directory.CreateDirectory(fileSavePath);
File.WriteAllText(waitSaveProfile.Path, saveProfileDictionary);
}
///
/// 储存配置文件
///
///
public static void SaveProfiles()
{
foreach (var profile in Profiles)
SaveProfile(profile);
}
///
/// 储存指定的配置文件
///
/// 配置文件
///
public static async Task SaveProfileAsync(ProfileInfo profileInfo)
{
var waitSaveProfile = Profiles.Find(x => x.Profile == profileInfo.Profile);
if (waitSaveProfile is null)
return;
var saveProfileDictionary = new XFEDictionary();
foreach (var property in waitSaveProfile.PropertiesInfo)
saveProfileDictionary.Add(property.Name, SaveProfilesFunc(property));
var fileSavePath = Path.GetDirectoryName(waitSaveProfile.Path);
if (!Directory.Exists(fileSavePath) && fileSavePath is not null && fileSavePath != string.Empty)
Directory.CreateDirectory(fileSavePath);
await File.WriteAllTextAsync(waitSaveProfile.Path, saveProfileDictionary);
}
///
/// 储存配置文件
///
///
public static async Task SaveProfilesAsync()
{
foreach (var profile in Profiles)
await SaveProfileAsync(profile);
}
///
/// 设置储存配置文件的方法
///
/// 储存方法
public static void SetSaveProfilesFunction(Func saveProfilesFunc) => SaveProfilesFunc = saveProfilesFunc;
///
/// 设置加载配置文件的方法
///
/// 加载方法
public static void SetLoadProfilesFunction(Func loadProfilesFunc) => LoadProfilesFunc = loadProfilesFunc;
///
/// 可写在属性的set访问器后,用于自动储存
///
///
///
protected static void AutoSave(ProfileInfo profileInfo) => SaveProfile(profileInfo);
///
/// 可写在属性的set访问器后,用于自动储存
///
///
///
protected static async Task AutoSaveAsync(ProfileInfo profileInfo) => await SaveProfileAsync(profileInfo);
}