From c80c3b4d33f0ca1bcba7657e405ad03c6548e85e Mon Sep 17 00:00:00 2001 From: Alexandre Mutel Date: Sat, 5 Mar 2022 16:54:15 +0100 Subject: [PATCH] Add support for deserializing to arrays --- .../ModelTests/ReflectionModelTests.cs | 39 +++++++++++++++++++ src/Tomlyn/Model/SyntaxToModelTransform.cs | 17 +++++--- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/src/Tomlyn.Tests/ModelTests/ReflectionModelTests.cs b/src/Tomlyn.Tests/ModelTests/ReflectionModelTests.cs index ec50441..6c8d3f8 100644 --- a/src/Tomlyn.Tests/ModelTests/ReflectionModelTests.cs +++ b/src/Tomlyn.Tests/ModelTests/ReflectionModelTests.cs @@ -283,6 +283,7 @@ public void TestModelWithSpecialDictionary() a = 1 b = true ".ReplaceLineEndings().Trim(); + StandardTests.DisplayHeader("input"); Console.WriteLine(input); var model = Toml.ToModel(input); @@ -304,6 +305,28 @@ public void TestModelWithSpecialDictionary() Assert.AreEqual(output, input); } + [Test] + public void TestModelWithArray() + { + var input = @"values = ['1', '2', '3']"; + + StandardTests.DisplayHeader("input"); + Console.WriteLine(input); + var model = Toml.ToModel(input); + CollectionAssert.AreEqual(new string[] { "1", "2", "3"}, model.Values); + } + + [Test] + public void TestModelWithFixedList() + { + var input = @"values = ['1', '2', '3']"; + + StandardTests.DisplayHeader("input"); + Console.WriteLine(input); + var model = Toml.ToModel(input); + CollectionAssert.AreEqual(new List { "1", "2", "3" }, model.Values); + } + public class SimpleModel { public SimpleModel() @@ -326,6 +349,22 @@ public SimpleModel() public List SubModels { get; } } + public class ModelWithArray + { + public string[]? Values { get; set; } + } + + public class ModelWithFixedList + { + public ModelWithFixedList() + { + Values = new List(); + } + + public List Values { get; } + } + + public class SimpleSubModel { public string? Id { get; set; } diff --git a/src/Tomlyn/Model/SyntaxToModelTransform.cs b/src/Tomlyn/Model/SyntaxToModelTransform.cs index 7dbd190..6981da5 100644 --- a/src/Tomlyn/Model/SyntaxToModelTransform.cs +++ b/src/Tomlyn/Model/SyntaxToModelTransform.cs @@ -270,12 +270,16 @@ public override void Visit(IntegerValueSyntax integerValueSyntax) _currentValue = integerValueSyntax.Value; } - public override void Visit(ArraySyntax array) + public override void Visit(ArraySyntax arraySyntax) { var stackCount = _objectStack.Count; try { - var list = _context.CreateInstance(_currentTargetType!, ObjectKind.Array); + var items = arraySyntax.Items; + var currentTargetType = _currentTargetType!; + var isArray = currentTargetType.IsArray; + var list = isArray ? Array.CreateInstance(currentTargetType.GetElementType()!, items.ChildrenCount) : _context.CreateInstance(currentTargetType, ObjectKind.Array); + var array = list as Array; var fastList = list as IList; var accessor = _context.GetAccessor(list.GetType()); var listAccessor = accessor as ListDynamicAccessor; @@ -283,11 +287,10 @@ public override void Visit(ArraySyntax array) // Fail if we don't have a list accessor if (listAccessor is null) { - _context.Diagnostics.Error(array.Span, $"Invalid list type {list.GetType().FullName}. Getting a {accessor} instead."); + _context.Diagnostics.Error(arraySyntax.Span, $"Invalid list type {list.GetType().FullName}. Getting a {accessor} instead."); return; } - var items = array.Items; for (int i = 0; i < items.ChildrenCount; i++) { var item = items.GetChild(i)!; @@ -299,7 +302,11 @@ public override void Visit(ArraySyntax array) continue; } - if (fastList is not null) + if (array is not null) + { + array.SetValue(itemValue, i); + } + else if (fastList is not null) { fastList.Add(itemValue); }