Skip to content

Commit 9712288

Browse files
Codegen: Handel advanced_fields in Service metadata (#1132)
* Codegen: Handel advanced_fields in Servcie metadata * use unix path separator
1 parent 4a3cbb5 commit 9712288

File tree

4 files changed

+1023
-9
lines changed

4 files changed

+1023
-9
lines changed

src/HassModel/NetDaemon.HassModel.CodeGenerator/MetaData/ServicesMetaData/ServiceMetaDataParser.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,16 +59,9 @@ private static IReadOnlyCollection<HassService> GetServices(JsonElement domainEl
5959
var result = serviceElement.Deserialize<HassService>(SerializerOptions)! with
6060
{
6161
Service = serviceName,
62+
Fields = GetFields(serviceElement)
6263
};
6364

64-
if (serviceElement.TryGetProperty("fields", out var fieldProperty))
65-
{
66-
result = result with
67-
{
68-
Fields = fieldProperty.EnumerateObject().Select(p => GetField(p.Name, p.Value)).ToList()
69-
};
70-
}
71-
7265
return result;
7366
}
7467
catch (Exception ex)
@@ -78,6 +71,14 @@ private static IReadOnlyCollection<HassService> GetServices(JsonElement domainEl
7871
}
7972
}
8073

74+
private static List<HassServiceField> GetFields(JsonElement element)
75+
{
76+
if (!element.TryGetProperty("fields", out var fieldProperty)) return [];
77+
78+
// advanced_fields can have nested fields inside, we flatten them to a single list of fields
79+
return fieldProperty.EnumerateObject().SelectMany(p => p.Name == "advanced_fields" ? GetFields(p.Value) : [GetField(p.Name, p.Value)]).ToList();
80+
}
81+
8182
private static HassServiceField GetField(string fieldName, JsonElement element)
8283
{
8384
return element.Deserialize<HassServiceField>(SerializerOptions)! with

src/HassModel/NetDaemon.HassModel.Tests/CodeGenerator/ServiceMetaDataParserTest.cs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Text.Json;
1+
using System.Runtime.InteropServices.ComTypes;
2+
using System.Text.Json;
23
using NetDaemon.HassModel.CodeGenerator;
34
using NetDaemon.HassModel.CodeGenerator.Model;
45

@@ -42,6 +43,38 @@ public void TestSomeBasicServicesCanBeParsed()
4243
res.First().Services.ElementAt(1).Target!.Entity.SelectMany(e=>e.Domain).Should().BeEmpty();
4344
}
4445

46+
[Fact]
47+
public void TestServicesWithAdvancedFieldsCanBeParsed()
48+
{
49+
var sample = File.ReadAllText(@"CodeGenerator/ServiceMetaDataSamples/Lights.json");
50+
51+
var res = Parse(sample);
52+
res.Should().HaveCount(1);
53+
var lightsDomain = res.First();
54+
55+
lightsDomain.Domain.Should().Be("light");
56+
lightsDomain.Services.Select(s => s.Service).Should().BeEquivalentTo("turn_on", "turn_off", "toggle");
57+
var turnOnService = lightsDomain.Services.First();
58+
turnOnService.Fields!.Select(f => f.Field).Should().BeEquivalentTo(
59+
"transition",
60+
"rgb_color",
61+
"kelvin",
62+
"brightness_pct",
63+
"brightness_step_pct",
64+
"effect",
65+
"rgbw_color",
66+
"rgbww_color",
67+
"color_name",
68+
"hs_color",
69+
"xy_color",
70+
"color_temp",
71+
"brightness",
72+
"brightness_step",
73+
"white",
74+
"profile",
75+
"flash");
76+
}
77+
4578
[Fact]
4679
public void TestServicesWithReturnValueCanBeParsed()
4780
{

0 commit comments

Comments
 (0)