Skip to content

Commit

Permalink
Corrected edge case with nested arrays parsing
Browse files Browse the repository at this point in the history
  • Loading branch information
loudenvier committed Nov 22, 2023
1 parent 64173a7 commit 6361926
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 11 deletions.
14 changes: 4 additions & 10 deletions NetDot/DotNotation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,20 +58,14 @@ private static void ParseInternal(string singleLine, IDictionary<string, object>
list[member.Index] = new Dictionary<string, object>();
}
current = list;
//StoreArrayItem((List<object?>)memberProp, member, isLast ? value : property);
} else {
if (current is not IDictionary<string, object> dict)
dict = (IDictionary<string, object>)((List<object?>)current)[lastArrayIndex]!;
if (isLast) {
if (current is IDictionary<string, object> dict)
dict[member.Name] = value;
else if (current is List<object?> list) {
dict = (IDictionary<string, object>)list[lastArrayIndex]!;
dict[member.Name] = value;
//list[lastArrayIndex] = value;
}
dict[member.Name] = value;
} else {
var dict = (IDictionary<string, object>)current;
var newProp = dict.ContainsKey(member.Name) ? dict[member.Name] : new Dictionary<string, object>();
((IDictionary<string, object>)current)[member.Name] = newProp;
dict[member.Name] = newProp;
current = newProp;
}
}
Expand Down
2 changes: 1 addition & 1 deletion NetDot/NetDot.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>latest</LangVersion>
<Nullable>enable</Nullable>
<VersionPrefix>1.2.0</VersionPrefix>
<VersionPrefix>1.2.1</VersionPrefix>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<Title>NetDot</Title>
<Authors>felipemachado</Authors>
Expand Down
34 changes: 34 additions & 0 deletions NetDotTests/DotNotationParsingtests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,40 @@ public void ArrayItemCanBeComplex() {
Assert.Equal("47", felipe["idade"]);
}
[Fact]
public void ArrayItemCanBeComplexAndHoldArraysOnTheirOwn() {
var dict = DotNotation.Parse("""
time.pessoa[0].nome=felipe
time.pessoa[0].amigos.principais[0].nome=ricardo
time.pessoa[0].amigos.principais[1].nome=claudio
""");
Assert.NotNull(dict);
Assert.Single(dict);
var time = dict["time"] as Dictionary<string, object>;
Assert.NotNull(time);
Assert.Single(time);
var pessoas = time["pessoa"] as List<object?>;
Assert.NotNull(pessoas);
Assert.Single(pessoas);
var felipe = pessoas[0] as Dictionary<string, object>;
Assert.NotNull(felipe);
Assert.Equal(2, felipe.Count);
Assert.Equal("felipe", felipe["nome"]);
var amigos = felipe["amigos"] as Dictionary<string, object>;
Assert.NotNull(amigos);
Assert.Single(amigos);
var principais = amigos["principais"] as List<object?>;
Assert.NotNull(principais);
Assert.Equal(2, principais.Count);
var ricardo = principais[0] as Dictionary<string, object>;
Assert.NotNull(ricardo);
Assert.Single(ricardo);
Assert.Equal("ricardo", ricardo["nome"]);
var claudio = principais[1] as Dictionary<string, object>;
Assert.NotNull(claudio);
Assert.Single(claudio);
Assert.Equal("claudio", claudio["nome"]);
}
[Fact]
public void CanParseIntoExpandoObject() {
dynamic pessoa = new ExpandoObject();
dynamic result = DotNotation.Parse("""
Expand Down

0 comments on commit 6361926

Please sign in to comment.