Skip to content

Commit 579bcd0

Browse files
committed
Create SerializableComponent: Better, unified API for serializable objects
1 parent 3fbb1ce commit 579bcd0

9 files changed

Lines changed: 92 additions & 36 deletions

File tree

src/UniGetUI.PAckageEngine.Interfaces/IInstallationOptions.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ public interface IInstallationOptions
2020
public IPackage Package { get; }
2121

2222
/// <summary>
23-
/// Loads and applies the options from the given SerializableInstallationOptions_v1 object to the current object.
23+
/// Loads and applies the options from the given SerializableInstallationOptions object to the current object.
2424
/// </summary>
25-
public void FromSerializable(SerializableInstallationOptions_v1 options);
25+
public void FromSerializable(SerializableInstallationOptions options);
2626

2727
/// <summary>
28-
/// Returns a SerializableInstallationOptions_v1 object containing the options of the current instance.
28+
/// Returns a SerializableInstallationOptions object containing the options of the current instance.
2929
/// </summary>
30-
public SerializableInstallationOptions_v1 AsSerializable();
30+
public SerializableInstallationOptions AsSerializable();
3131

3232
/// <summary>
3333
/// Saves the current options to disk, asynchronously.

src/UniGetUI.PackageEngine.PackageManagerClasses/Packages/Classes/InstallationOptions.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,9 @@ public static async Task<InstallationOptions> FromPackageAsync(IPackage package,
9595
}
9696

9797
/// <summary>
98-
/// Returns a new InstallationOptions object from a given SerializableInstallationOptions_v1 and a package.
98+
/// Returns a new InstallationOptions object from a given SerializableInstallationOptions and a package.
9999
/// </summary>
100-
public static InstallationOptions FromSerialized(SerializableInstallationOptions_v1 options, IPackage package)
100+
public static InstallationOptions FromSerialized(SerializableInstallationOptions options, IPackage package)
101101
{
102102
InstallationOptions instance = new(package);
103103
instance.FromSerializable(options);
@@ -111,9 +111,9 @@ public static InstallationOptions CreateEmpty(IPackage package)
111111
}
112112

113113
/// <summary>
114-
/// Loads and applies the options from the given SerializableInstallationOptions_v1 object to the current object.
114+
/// Loads and applies the options from the given SerializableInstallationOptions object to the current object.
115115
/// </summary>
116-
public void FromSerializable(SerializableInstallationOptions_v1 options)
116+
public void FromSerializable(SerializableInstallationOptions options)
117117
{
118118
SkipHashCheck = options.SkipHashCheck;
119119
InteractiveInstallation = options.InteractiveInstallation;
@@ -145,11 +145,11 @@ public void FromSerializable(SerializableInstallationOptions_v1 options)
145145
}
146146

147147
/// <summary>
148-
/// Returns a SerializableInstallationOptions_v1 object containing the options of the current instance.
148+
/// Returns a SerializableInstallationOptions object containing the options of the current instance.
149149
/// </summary>
150-
public SerializableInstallationOptions_v1 AsSerializable()
150+
public SerializableInstallationOptions AsSerializable()
151151
{
152-
SerializableInstallationOptions_v1 options = new()
152+
SerializableInstallationOptions options = new()
153153
{
154154
SkipHashCheck = SkipHashCheck,
155155
InteractiveInstallation = InteractiveInstallation,
@@ -229,7 +229,7 @@ public void LoadFromDisk()
229229
if (jsonData is null)
230230
return;
231231

232-
var serializedOptions = SerializableInstallationOptions_v1.FromJsonString(jsonData);
232+
var serializedOptions = SerializableInstallationOptions.FromJsonString(jsonData);
233233
FromSerializable(serializedOptions);
234234
}
235235
catch (JsonException)

src/UniGetUI.PackageEngine.PackageManagerClasses/Packages/ImportedPackage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public partial class ImportedPackage : Package
1111
/// Construct an invalid package with a given name, id, version, source and manager, and an optional scope.
1212
/// </summary>
1313
public SerializableUpdatesOptions_v1 updates_options;
14-
public SerializableInstallationOptions_v1 installation_options;
14+
public SerializableInstallationOptions installation_options;
1515

1616
private readonly string _version;
1717

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
using System.Text.Json;
2+
using System.Text.Json.Nodes;
3+
using UniGetUI.Core.Data;
4+
5+
namespace UniGetUI.PackageEngine.Serializable;
6+
7+
public abstract class SerializableComponent
8+
{
9+
/// <summary>
10+
/// Creates a deep copy of the object
11+
/// </summary>
12+
/// <returns>A memory-independend copy of this</returns>
13+
public abstract SerializableComponent Copy();
14+
15+
/// <summary>
16+
/// Loads data for this object from a JsonNode object
17+
/// </summary>
18+
/// <param name="data">The JSON from which to load the data</param>
19+
public abstract void LoadFromJson(JsonNode data);
20+
21+
/// <summary>
22+
/// Serializes this object into a JsonNode object
23+
/// </summary>
24+
/// <returns>A pretty-formatted JSON string representing the current data</returns>
25+
public string AsJsonString()
26+
{
27+
return JsonSerializer.Serialize(this, SerializationHelpers.DefaultOptions);
28+
}
29+
30+
/// <summary>
31+
/// Serializes this object into a JsonNode object
32+
/// </summary>
33+
/// <returns>A pretty-formatted JSON string representing the current data</returns>
34+
public JsonNode AsJsonNode()
35+
{
36+
return JsonNode.Parse(AsJsonString()) ?? throw new InvalidDataException("The JSON object could not be parsed to a JsonNode");
37+
}
38+
39+
/// <summary>
40+
/// Creates an instance of this object with the default data
41+
/// </summary>
42+
public SerializableComponent() {}
43+
44+
/// <summary>
45+
/// Creates an instance of this object, and loads the data from the given JsonNode object
46+
/// </summary>
47+
/// <param name="data">The JSON from which to load the data</param>
48+
public SerializableComponent(JsonNode data)
49+
{
50+
LoadFromJson(data);
51+
}
52+
}

src/UniGetUI.PackageEngine.Serializable/SerializableInstallationOptions.cs

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace UniGetUI.PackageEngine.Serializable
44
{
5-
public class SerializableInstallationOptions_v1
5+
public class SerializableInstallationOptions: SerializableComponent
66
{
77
public bool SkipHashCheck { get; set; }
88
public bool InteractiveInstallation { get; set; }
@@ -15,7 +15,7 @@ public class SerializableInstallationOptions_v1
1515
public string Version { get; set; } = "";
1616
public bool SkipMinorUpdates { get; set; }
1717

18-
public SerializableInstallationOptions_v1 Copy()
18+
public override SerializableInstallationOptions Copy()
1919
{
2020
return new()
2121
{
@@ -32,24 +32,22 @@ public SerializableInstallationOptions_v1 Copy()
3232
};
3333
}
3434

35-
public static SerializableInstallationOptions_v1 FromJsonString(JsonNode data)
35+
public override void LoadFromJson(JsonNode data)
3636
{
37-
var options = new SerializableInstallationOptions_v1();
38-
options.SkipHashCheck = data[nameof(SkipHashCheck)]?.GetValue<bool>() ?? false;
39-
options.InteractiveInstallation = data[nameof(InteractiveInstallation)]?.GetValue<bool>() ?? false;
40-
options.RunAsAdministrator = data[nameof(RunAsAdministrator)]?.GetValue<bool>() ?? false;
41-
options.Architecture = data[nameof(Architecture)]?.GetValue<string>() ?? "";
42-
options.InstallationScope = data[nameof(InstallationScope)]?.GetValue<string>() ?? "";
37+
this.SkipHashCheck = data[nameof(SkipHashCheck)]?.GetValue<bool>() ?? false;
38+
this.InteractiveInstallation = data[nameof(InteractiveInstallation)]?.GetValue<bool>() ?? false;
39+
this.RunAsAdministrator = data[nameof(RunAsAdministrator)]?.GetValue<bool>() ?? false;
40+
this.Architecture = data[nameof(Architecture)]?.GetValue<string>() ?? "";
41+
this.InstallationScope = data[nameof(InstallationScope)]?.GetValue<string>() ?? "";
4342

44-
options.CustomParameters = new List<string>();
43+
this.CustomParameters = new List<string>();
4544
foreach(var element in data[nameof(CustomParameters)]?.AsArray() ?? [])
46-
if (element is not null) options.CustomParameters.Add(element.GetValue<string>());
45+
if (element is not null) this.CustomParameters.Add(element.GetValue<string>());
4746

48-
options.PreRelease = data[nameof(PreRelease)]?.GetValue<bool>() ?? false;
49-
options.CustomInstallLocation = data[nameof(CustomInstallLocation)]?.GetValue<string>() ?? "";
50-
options.Version = data[nameof(Version)]?.GetValue<string>() ?? "";
51-
options.SkipMinorUpdates = data[nameof(SkipMinorUpdates)]?.GetValue<bool>() ?? false;
52-
return options;
47+
this.PreRelease = data[nameof(PreRelease)]?.GetValue<bool>() ?? false;
48+
this.CustomInstallLocation = data[nameof(CustomInstallLocation)]?.GetValue<string>() ?? "";
49+
this.Version = data[nameof(Version)]?.GetValue<string>() ?? "";
50+
this.SkipMinorUpdates = data[nameof(SkipMinorUpdates)]?.GetValue<bool>() ?? false;
5351
}
5452
}
5553
}

src/UniGetUI.PackageEngine.Serializable/SerializablePackage_v1.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public class SerializablePackage_v1
3232
/// <summary>
3333
/// The InstallationOptions associated to this package
3434
/// </summary>
35-
public SerializableInstallationOptions_v1 InstallationOptions { get; set; } = new();
35+
public SerializableInstallationOptions InstallationOptions { get; set; } = new();
3636

3737
/// <summary>
3838
/// The Updates preferences associated to this package

src/UniGetUI.PackageEngine.Serializable/UniGetUI.PackageEngine.Serializable.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,10 @@
55
<ItemGroup>
66
<Compile Include="..\SharedAssemblyInfo.cs" Link="SharedAssemblyInfo.cs" />
77
</ItemGroup>
8+
9+
10+
11+
<ItemGroup>
12+
<ProjectReference Include="..\UniGetUI.Core.Tools\UniGetUI.Core.Tools.csproj" />
13+
</ItemGroup>
814
</Project>

src/UniGetUI/Pages/DialogPages/DialogHelper_Packages.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,10 @@ public static async Task<ContentDialogResult> ShowInstallOptions_ImportedPackage
5050
return dialogResult;
5151
}
5252

53-
private static async Task<(SerializableInstallationOptions_v1, ContentDialogResult)> ShowInstallOptions(
53+
private static async Task<(SerializableInstallationOptions, ContentDialogResult)> ShowInstallOptions(
5454
IPackage package,
5555
OperationType operation,
56-
SerializableInstallationOptions_v1 options)
56+
SerializableInstallationOptions options)
5757
{
5858
InstallOptionsPage OptionsPage = new(package, operation, options);
5959

src/UniGetUI/Pages/DialogPages/InstallOptions.xaml.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@ namespace UniGetUI.Interface.Dialogs
1818
/// </summary>
1919
public sealed partial class InstallOptionsPage : Page
2020
{
21-
public SerializableInstallationOptions_v1 Options;
21+
public SerializableInstallationOptions Options;
2222
public IPackage Package;
2323
public event EventHandler? Close;
2424
private readonly OperationType Operation;
2525
private readonly string packageInstallLocation;
2626
private bool _uiLoaded;
2727

28-
public InstallOptionsPage(IPackage package, SerializableInstallationOptions_v1 options) : this(package, OperationType.None, options) { }
29-
public InstallOptionsPage(IPackage package, OperationType operation, SerializableInstallationOptions_v1 options)
28+
public InstallOptionsPage(IPackage package, SerializableInstallationOptions options) : this(package, OperationType.None, options) { }
29+
public InstallOptionsPage(IPackage package, OperationType operation, SerializableInstallationOptions options)
3030
{
3131
Package = package;
3232
InitializeComponent();
@@ -161,7 +161,7 @@ private async Task LoadVersions()
161161
VersionProgress.Visibility = Visibility.Collapsed;
162162
}
163163

164-
public async Task<SerializableInstallationOptions_v1> GetUpdatedOptions(bool updateIgnoredUpdates = true)
164+
public async Task<SerializableInstallationOptions> GetUpdatedOptions(bool updateIgnoredUpdates = true)
165165
{
166166
Options.RunAsAdministrator = AdminCheckBox?.IsChecked ?? false;
167167
Options.InteractiveInstallation = InteractiveCheckBox?.IsChecked ?? false;

0 commit comments

Comments
 (0)