Skip to content

Commit d7a651a

Browse files
committed
Added the ability to customize the version transformer
1 parent 8e6ed4d commit d7a651a

File tree

6 files changed

+99
-72
lines changed

6 files changed

+99
-72
lines changed

Tests/Utils.Tests/UserSettingsServiceTests.cs

+42-10
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,21 @@ public class SettsMock1
2424
public double Field2 { get; set; }
2525
}
2626

27-
[UserSettingVersion("2.1.0", typeof(SettsMockTransformer))]
27+
[UserSettingVersion("2.1.0", typeof(SettsMock2Transformer))]
2828
public class SettsMock2
2929
{
3030
public string Field1 { get; set; }
3131
public double Field3 { get; set; }
3232
public bool Field4 { get; set; }
3333
}
3434

35-
public class SettsMockTransformer : IEnumerable<VersionTransform>
35+
public class SettsMock2Transformer : IVersionsTransformer
3636
{
37-
public Type SettingType => typeof(SettsMock2);
37+
public IReadOnlyList<VersionTransform> Transforms => m_Transforms;
3838

3939
private List<VersionTransform> m_Transforms;
4040

41-
public SettsMockTransformer()
41+
public SettsMock2Transformer()
4242
{
4343
m_Transforms = new List<VersionTransform>();
4444
m_Transforms.Add(new VersionTransform(
@@ -52,15 +52,29 @@ public SettsMockTransformer()
5252
return t;
5353
}));
5454
}
55+
}
5556

56-
public IEnumerator<VersionTransform> GetEnumerator()
57-
{
58-
return m_Transforms.GetEnumerator();
59-
}
57+
public class SettsMock5Transformer : IVersionsTransformer
58+
{
59+
public IReadOnlyList<VersionTransform> Transforms => m_Transforms;
60+
61+
private List<VersionTransform> m_Transforms;
62+
63+
public string NewValue { get; set; }
6064

61-
IEnumerator IEnumerable.GetEnumerator()
65+
public SettsMock5Transformer()
6266
{
63-
return m_Transforms.GetEnumerator();
67+
m_Transforms = new List<VersionTransform>();
68+
m_Transforms.Add(new VersionTransform(
69+
new Version("1.0"),
70+
new Version("2.0"),
71+
t =>
72+
{
73+
var field1 = t.Children<JProperty>().First(p => p.Name == "Field1");
74+
field1.Value = new JValue(NewValue);
75+
76+
return t;
77+
}));
6478
}
6579
}
6680

@@ -74,6 +88,12 @@ public class SettsMock4
7488
public IObjectType Obj { get; set; }
7589
}
7690

91+
[UserSettingVersion("2.0", typeof(SettsMock5Transformer))]
92+
public class SettsMock5
93+
{
94+
public string Field1 { get; set; }
95+
}
96+
7797
public interface IObjectType
7898
{
7999
string Value { get; set; }
@@ -223,5 +243,17 @@ public void CustomConverterAndVersionTest()
223243
Assert.AreEqual("{\"Field1\":\"ABC\",\"Field3\":0.0,\"Field4\":false,\"__version\":\"2.1.0\"}", res1.ToString());
224244
Assert.AreEqual("XYZ", res2.Field1);
225245
}
246+
247+
[Test]
248+
public void TransformHandlerTest()
249+
{
250+
var srv = new UserSettingsService();
251+
252+
var mock1 = "{\"Field1\":\"AAA\",\"__version\":\"1.0\"}";
253+
254+
var setts1 = srv.ReadSettings<SettsMock5>(new StringReader(mock1), t => { ((SettsMock5Transformer)t).NewValue = "BBB"; return t; });
255+
256+
Assert.AreEqual("BBB", setts1.Field1);
257+
}
226258
}
227259
}

docs/_src/utils/UserSettingsDocs.cs

+19-15
Original file line numberDiff line numberDiff line change
@@ -48,27 +48,31 @@ public class UserSettings
4848
//---
4949

5050
//--- transformer
51-
public class UserSettingsVersionTransformer : BaseUserSettingsVersionsTransformer
51+
public class UserSettingsVersionTransformer : IVersionsTransformer
5252
{
53+
public IReadOnlyList<VersionTransform> Transforms { get; }
54+
5355
public UserSettingsVersionTransformer()
5456
{
55-
Add(new Version("1.0.0"), new Version("2.0.0"), t =>
56-
{
57-
var field1 = t.Children<JProperty>().First(p => p.Name == "Field1");
58-
field1.Replace(new JProperty("TextField", (field1 as JProperty).Value));
59-
return t;
60-
});
61-
62-
Add(new Version("2.0.0"), new Version("3.0.0"), t =>
57+
Transforms = new VersionTransform[]
6358
{
64-
var field2 = t.Children<JProperty>().First(p => p.Name == "Field2");
65-
field2.Replace(new JProperty("DoubleField", (field2 as JProperty).Value));
59+
new VersionTransform(new Version("1.0.0"), new Version("2.0.0"), t =>
60+
{
61+
var field1 = t.Children<JProperty>().First(p => p.Name == "Field1");
62+
field1.Replace(new JProperty("TextField", (field1 as JProperty).Value));
63+
return t;
64+
}),
65+
new VersionTransform(new Version("2.0.0"), new Version("3.0.0"), t =>
66+
{
67+
var field2 = t.Children<JProperty>().First(p => p.Name == "Field2");
68+
field2.Replace(new JProperty("DoubleField", (field2 as JProperty).Value));
6669

67-
var field3 = t.Children<JProperty>().First(p => p.Name == "Field3");
68-
field3.Replace(new JProperty("BoolField", (field3 as JProperty).Value));
70+
var field3 = t.Children<JProperty>().First(p => p.Name == "Field3");
71+
field3.Replace(new JProperty("BoolField", (field3 as JProperty).Value));
6972

70-
return t;
71-
});
73+
return t;
74+
})
75+
};
7276
}
7377
}
7478
//---

docs/_src/utils/UserSettingsDocs.vb

+19-17
Original file line numberDiff line numberDiff line change
@@ -44,26 +44,28 @@ Namespace Utils.Docs
4444

4545
'--- transformer
4646
Public Class UserSettingsVersionTransformer
47-
Inherits BaseUserSettingsVersionsTransformer
47+
Implements IVersionsTransformer
4848

4949
Public Sub New()
50-
Add(New Version("1.0.0"),
51-
New Version("2.0.0"),
52-
Function(t)
53-
Dim field1 = t.Children(Of JProperty)().First(Function(p) p.Name = "Field1")
54-
field1.Replace(New JProperty("TextField", (TryCast(field1, JProperty)).Value))
55-
Return t
56-
End Function)
57-
Add(New Version("2.0.0"),
58-
New Version("3.0.0"),
59-
Function(t)
60-
Dim field2 = t.Children(Of JProperty)().First(Function(p) p.Name = "Field2")
61-
field2.Replace(New JProperty("DoubleField", (TryCast(field2, JProperty)).Value))
62-
Dim field3 = t.Children(Of JProperty)().First(Function(p) p.Name = "Field3")
63-
field3.Replace(New JProperty("BoolField", (TryCast(field3, JProperty)).Value))
64-
Return t
65-
End Function)
50+
Transforms = New VersionTransform() {
51+
New VersionTransform(New Version("1.0.0"), New Version("2.0.0"),
52+
Function(t)
53+
Dim field1 = t.Children(Of JProperty)().First(Function(p) p.Name = "Field1")
54+
field1.Replace(New JProperty("TextField", (TryCast(field1, JProperty)).Value))
55+
Return t
56+
End Function),
57+
New VersionTransform(New Version("2.0.0"), New Version("3.0.0"),
58+
Function(t)
59+
Dim field2 = t.Children(Of JProperty)().First(Function(p) p.Name = "Field2")
60+
field2.Replace(New JProperty("DoubleField", (TryCast(field2, JProperty)).Value))
61+
Dim field3 = t.Children(Of JProperty)().First(Function(p) p.Name = "Field3")
62+
field3.Replace(New JProperty("BoolField", (TryCast(field3, JProperty)).Value))
63+
Return t
64+
End Function)}
6665
End Sub
66+
67+
Public ReadOnly Property Transforms As IReadOnlyList(Of VersionTransform) Implements IVersionsTransformer.Transforms
68+
6769
End Class
6870
'---
6971

src/Utils/Services/UserSettings/Attributes/UserSettingVersionAttribute.cs

+5-5
Original file line numberDiff line numberDiff line change
@@ -13,24 +13,24 @@ namespace Xarial.XToolkit.Services.UserSettings.Attributes
1313
public class UserSettingVersionAttribute : Attribute
1414
{
1515
internal Version Version { get; }
16-
internal IEnumerable<VersionTransform> VersionTransformers { get; }
16+
internal IVersionsTransformer VersionTransformer { get; }
1717

1818
/// <summary>
1919
/// Initiates the version support for this user setting
2020
/// </summary>
2121
/// <param name="version">Current (latest) version of settings</param>
22-
/// <param name="versionTransformerType">Collection of version transformers of <see cref="IEnumerable<VersionTransform>"/>. Use <see cref="BaseUserSettingsVersionsTransformer"/></param>
22+
/// <param name="versionTransformerType">Collection of version transformers of <see cref="IVersionsTransformer"/></param>
2323
public UserSettingVersionAttribute(string version, Type versionTransformerType)
2424
{
2525
Version = new Version(version);
2626

27-
if (typeof(IEnumerable<VersionTransform>).IsAssignableFrom(versionTransformerType))
27+
if (typeof(IVersionsTransformer).IsAssignableFrom(versionTransformerType))
2828
{
29-
VersionTransformers = (IEnumerable<VersionTransform>)Activator.CreateInstance(versionTransformerType);
29+
VersionTransformer = (IVersionsTransformer)Activator.CreateInstance(versionTransformerType);
3030
}
3131
else
3232
{
33-
throw new InvalidCastException($"'{versionTransformerType.FullName}' must implement '{nameof(IEnumerable<VersionTransform>)}' interface. Use '{typeof(BaseUserSettingsVersionsTransformer)}'");
33+
throw new InvalidCastException($"'{versionTransformerType.FullName}' must implement '{nameof(IVersionsTransformer)}' interface'");
3434
}
3535

3636
}

src/Utils/Services/UserSettings/BaseUserSettingsVersionsTransformer.cs

+2-21
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,8 @@
1212

1313
namespace Xarial.XToolkit.Services.UserSettings
1414
{
15-
public class BaseUserSettingsVersionsTransformer : IEnumerable<VersionTransform>
15+
public interface IVersionsTransformer
1616
{
17-
private List<VersionTransform> m_Transformers;
18-
19-
public BaseUserSettingsVersionsTransformer(params VersionTransform[] transformers)
20-
{
21-
m_Transformers = new List<VersionTransform>();
22-
23-
if (transformers != null)
24-
{
25-
m_Transformers.AddRange(transformers);
26-
}
27-
}
28-
29-
public IEnumerator<VersionTransform> GetEnumerator() => m_Transformers.GetEnumerator();
30-
31-
protected void Add(Version from, Version to, Func<JToken, JToken> transform)
32-
{
33-
m_Transformers.Add(new VersionTransform(from, to, transform));
34-
}
35-
36-
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
17+
IReadOnlyList<VersionTransform> Transforms { get; }
3718
}
3819
}

src/Utils/Services/UserSettings/UserSettingsService.cs

+12-4
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,20 @@ namespace Xarial.XToolkit.Services.UserSettings
1818
public class UserSettingsService
1919
{
2020
public T ReadSettings<T>(TextReader settsReader, params IValueSerializer[] serializers)
21+
=> ReadSettings<T>(settsReader, null, serializers);
22+
23+
public T ReadSettings<T>(TextReader settsReader, Func<IVersionsTransformer, IVersionsTransformer> versTransformerHandler, params IValueSerializer[] serializers)
2124
{
2225
var jsonSer = CreateJsonSerializer();
2326

24-
if (TryGetVersionInfo<T>(out Version vers, out IEnumerable<VersionTransform> transform))
27+
if (TryGetVersionInfo<T>(out Version vers, out IVersionsTransformer transform))
2528
{
26-
jsonSer.Converters.Add(new ReadSettingsJsonConverter(typeof(T), transform, vers));
29+
if (versTransformerHandler != null)
30+
{
31+
transform = versTransformerHandler.Invoke(transform);
32+
}
33+
34+
jsonSer.Converters.Add(new ReadSettingsJsonConverter(typeof(T), transform?.Transforms, vers));
2735
}
2836

2937
foreach (var ser in serializers)
@@ -53,12 +61,12 @@ public void StoreSettings<T>(T setts, TextWriter settsWriter, params IValueSeria
5361

5462
protected virtual JsonSerializer CreateJsonSerializer() => new JsonSerializer();
5563

56-
private bool TryGetVersionInfo<T>(out Version vers, out IEnumerable<VersionTransform> transforms)
64+
private bool TryGetVersionInfo<T>(out Version vers, out IVersionsTransformer transforms)
5765
{
5866
if (typeof(T).TryGetAttribute(out UserSettingVersionAttribute att, true))
5967
{
6068
vers = att.Version;
61-
transforms = att.VersionTransformers;
69+
transforms = att.VersionTransformer;
6270
return true;
6371
}
6472
else

0 commit comments

Comments
 (0)